~ chicken-core (chicken-5) 7f4200526af79d47fa84738bb4b0e712767a14ac


commit 7f4200526af79d47fa84738bb4b0e712767a14ac
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Fri Apr 27 13:15:08 2018 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Apr 28 23:20:48 2018 +0200

    Speed up compiled module registration by avoid unnecessary work
    
    The merge-se calls are still of quadratic complexity, but we can avoid
    doing a lot of the work when there are no macros exported by a module,
    since we do not need to patch up any syntax environments.
    
    Also avoid consing up a full list if all syntax environments are
    empty; we can just use that one list.
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/modules.scm b/modules.scm
index f8a00553..c450e525 100644
--- a/modules.scm
+++ b/modules.scm
@@ -295,14 +295,14 @@
 			  (loop2 (cdr iexports)))))))))))
 
 (define (merge-se . ses)		; later occurrences take precedence
-  (let bwd ((ses ses))
-    (if (null? ses)
-	'()
-	(let fwd ((se (car ses))
-		  (rest (bwd (cdr ses))))
-	  (cond ((null? se) rest)
-		((assq (caar se) rest) (fwd (cdr se) rest))
-		(else (cons (car se) (fwd (cdr se) rest))))))))
+  (let bwd ((ses (remove null? ses)))
+    (cond ((null? ses) '())
+	  ((null? (cdr ses)) (car ses))	; Do not re-cons the final list
+	  (else (let fwd ((se (car ses))
+			  (rest (bwd (cdr ses))))
+		  (cond ((null? se) rest)
+			((assq (caar se) rest) (fwd (cdr se) rest))
+			(else (cons (car se) (fwd (cdr se) rest)))))))))
 
 (define (##sys#compiled-module-registration mod)
   (let ((dlist (module-defined-list mod))
@@ -368,10 +368,13 @@
 		 (list (car ne) #f (##sys#ensure-transformer (cdr ne) (car ne))))
 	       sdefs))
 	 (mod (make-module name lib '() vexports sexps iexports))
-	 (senv (merge-se 
-		(##sys#macro-environment)
-		(##sys#current-environment)
-		iexports vexports sexps nexps)))
+	 (senv (if (or (not (null? sexps))  ; Only macros have an senv
+		       (not (null? nexps))) ; which must be patched up
+		   (merge-se
+		    (##sys#macro-environment)
+		    (##sys#current-environment)
+		    iexports vexports sexps nexps)
+		   '())))
     (for-each
      (lambda (sexp)
        (set-car! (cdr sexp) (merge-se (or (cadr sexp) '()) senv)))
Trap