~ruther/guix-local

9ffc1c00e55eb7931846dbb3fafcf54716fff57c — Ludovic Courtès 11 years ago 34942e9
packages: Optimize 'find-packages-by-name' to avoid disk accesses.

On a profile with 182 entries, "guix package --search-paths" goes from
4.5 seconds down to 0.4 second.

* gnu/packages.scm (find-packages-by-name): Make a name -> package vhash
  in a promise; access it with 'vhash-fold*'.
1 files changed, 13 insertions(+), 15 deletions(-)

M gnu/packages.scm
M gnu/packages.scm => gnu/packages.scm +13 -15
@@ 179,22 179,20 @@ same package twice."
          vlist-null
          (all-package-modules))))

(define* (find-packages-by-name name #:optional version)
  "Return the list of packages with the given NAME.  If VERSION is not #f,
(define find-packages-by-name
  (let ((packages (delay
                    (fold-packages (lambda (p r)
                                     (vhash-cons (package-name p) p r))
                                   vlist-null))))
    (lambda* (name #:optional version)
      "Return the list of packages with the given NAME.  If VERSION is not #f,
then only return packages whose version is equal to VERSION."
  (define right-package?
    (if version
        (lambda (p)
          (and (string=? (package-name p) name)
               (string=? (package-version p) version)))
        (lambda (p)
          (string=? (package-name p) name))))

  (fold-packages (lambda (package result)
                   (if (right-package? package)
                       (cons package result)
                       result))
                 '()))
      (let ((matching (vhash-fold* cons '() name (force packages))))
        (if version
            (filter (lambda (package)
                      (string=? (package-version package) version))
                    matching)
            matching)))))

(define find-newest-available-packages
  (memoize