~ 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