From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Mark H Weaver Newsgroups: gmane.lisp.guile.bugs Subject: bug#17147: Performance regression by 3000000% for evaluating "and" form Date: Mon, 31 Mar 2014 18:30:45 -0400 Message-ID: <87r45im25m.fsf@yeeloong.lan> References: <87k3ban107.fsf@fencepost.gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1396305148 18361 80.91.229.3 (31 Mar 2014 22:32:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 31 Mar 2014 22:32:28 +0000 (UTC) Cc: 17147@debbugs.gnu.org, request@debbugs.gnu.org To: David Kastrup Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Tue Apr 01 00:32:21 2014 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WUkke-0007BT-Cz for guile-bugs@m.gmane.org; Tue, 01 Apr 2014 00:32:20 +0200 Original-Received: from localhost ([::1]:51715 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUkke-0002oZ-0B for guile-bugs@m.gmane.org; Mon, 31 Mar 2014 18:32:20 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:40054) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUkkT-0002bt-Ri for bug-guile@gnu.org; Mon, 31 Mar 2014 18:32:16 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WUkkN-0005ut-6K for bug-guile@gnu.org; Mon, 31 Mar 2014 18:32:09 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:57228) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUkkN-0005up-3n for bug-guile@gnu.org; Mon, 31 Mar 2014 18:32:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1WUkkM-0001Du-Dq for bug-guile@gnu.org; Mon, 31 Mar 2014 18:32:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Mark H Weaver Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Mon, 31 Mar 2014 22:32:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17147 X-GNU-PR-Package: guile X-GNU-PR-Keywords: Original-Received: via spool by 17147-submit@debbugs.gnu.org id=B17147.13963051174688 (code B ref 17147); Mon, 31 Mar 2014 22:32:02 +0000 Original-Received: (at 17147) by debbugs.gnu.org; 31 Mar 2014 22:31:57 +0000 Original-Received: from localhost ([127.0.0.1]:58410 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WUkkC-0001DQ-TS for submit@debbugs.gnu.org; Mon, 31 Mar 2014 18:31:56 -0400 Original-Received: from world.peace.net ([96.39.62.75]:48870) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WUkk1-0001Cv-Ef; Mon, 31 Mar 2014 18:31:47 -0400 Original-Received: from 209-6-91-212.c3-0.smr-ubr1.sbo-smr.ma.cable.rcn.com ([209.6.91.212] helo=yeeloong.lan) by world.peace.net with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1WUkju-0006tr-Be; Mon, 31 Mar 2014 18:31:34 -0400 In-Reply-To: <87k3ban107.fsf@fencepost.gnu.org> (David Kastrup's message of "Mon, 31 Mar 2014 11:58:00 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Original-Sender: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:7429 Archived-At: severity 17147 wishlist thanks David Kastrup writes: > The following program goes from 2.3ms execution time to 80s execution > time when going from Guile-1.8 to current master. > > (use-modules (srfi srfi-19)) > (define start-time (current-time)) > (primitive-eval (cons 'and (make-list 10000 #f))) > (display (time-difference (current-time) start-time)) I suspect the reason this works well on Guile 1.8 is that macros are expanded lazily, and since the first argument is #f, it doesn't need to expand the rest. Guile 2.0 uses a different macro expander which is vastly superior in most respects and needed to support modern Scheme programs, but it is not lazy. Guile 2 is primarily designed to work in a compiled mode anyway, where laziness is pointless and would most likely slow things down. (and x y ...) expands into (if x (and y ...) #f), so your huge 'and' form turns into a very deeply nested expression, and this overflows the compiler's stack on Guile 2.0.x. Thanks to Andy's recent work on expandable stacks in master, this case works properly there. While it would of course be ideal for our compiler to efficiently handle expressions 10000 levels deep (if it can be done without sacrificing maintainability), dealing with such pathological cases should not be a high priority, IMO. There are many more important things to work on. Is this just an academic exercise, or does Lilypond generate massively huge expressions like this? Mark