packages: Cache the result of 'input-grafts'.

This reduces the wall-clock time of

  guix environment gnutls --pure -E true

by ~35%.

* guix/packages.scm (%graft-cache): New variable.
(input-graft): Use 'cached' to cache to %GRAFT-CACHE.
This commit is contained in:
Ludovic Courtès 2016-03-07 23:57:33 +01:00
parent 9775412ee0
commit ced71ac7a7

View file

@ -843,6 +843,11 @@ (define* (package->bag package #:optional
(&package-error
(package package)))))))))))
(define %graft-cache
;; 'eq?' cache mapping package objects to a graft corresponding to their
;; replacement package.
(make-weak-key-hash-table 200))
(define (input-graft store system)
"Return a procedure that, given a package with a graft, returns a graft, and
#f otherwise."
@ -850,12 +855,13 @@ (define (input-graft store system)
((? package? package)
(let ((replacement (package-replacement package)))
(and replacement
(let ((orig (package-derivation store package system
#:graft? #f))
(new (package-derivation store replacement system)))
(graft
(origin orig)
(replacement new))))))
(cached (=> %graft-cache) package system
(let ((orig (package-derivation store package system
#:graft? #f))
(new (package-derivation store replacement system)))
(graft
(origin orig)
(replacement new)))))))
(x
#f)))