From f726f6f8021e78b6a50ca0dbdb4acc91ed2161c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sun, 27 Oct 2019 15:24:41 +0100 Subject: [PATCH] derivations: 'build-expression->derivation' caches its module derivations. This reduces the number of lookups in the 'add-data-to-store' cache from 7505 to 3329 (hit rate from 68% to 27%) when running: GUIX_PROFILING=add-data-to-store-cache guix build libreoffice -nd The execution time of "guix build libreoffice -nd" goes from 2.12s to 1.87s. * guix/derivations.scm (%module-cache): New variable. (imported+compiled-modules)[key]: New variable. Lookup KEY in %MODULE-CACHE and populate %MODULE-CACHE upon cache miss. --- guix/derivations.scm | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/guix/derivations.scm b/guix/derivations.scm index 8309f845d9..140c22b620 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -1207,13 +1207,25 @@ they can refer to each other." #:guile-for-build guile #:local-build? #t))) +(define %module-cache + ;; Map a list of modules to its 'imported+compiled-modules' result. + (make-weak-value-hash-table)) + (define* (imported+compiled-modules store modules #:key (system (%current-system)) (guile (%guile-for-build))) "Return a pair containing the derivation to import MODULES and that where MODULES are compiled." - (cons (%imported-modules store modules #:system system #:guile guile) - (%compiled-modules store modules #:system system #:guile guile))) + (define key + (list modules (derivation-file-name guile) system)) + + (or (hash-ref %module-cache key) + (let ((result (cons (%imported-modules store modules + #:system system #:guile guile) + (%compiled-modules store modules + #:system system #:guile guile)))) + (hash-set! %module-cache key result) + result))) (define* (build-expression->derivation store name exp ;deprecated #:key