From d3ec5b23d38acd4e755a8e016310c2c85a90887d Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Fri, 27 Apr 2018 13:15:08 +0200 Subject: [PATCH 2/2] 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. --- modules.scm | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/modules.scm b/modules.scm index e0240fbf..bd2ba1e2 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))) -- 2.11.0