~ruther/guix-local

1199da08aa76f7bba57692b4b8e9272fd305e9f2 — Ludovic Courtès 7 years ago 32c055f
size: Optimize dependency size computation.

This reduces 'guix size' run time by ~4% here:

  items="$(guix build icecat inkscape emacs libreoffice)"
  guix size $items

* guix/scripts/size.scm (store-profile): Define 'size-table' and use it
to lookup the size of ITEM in 'dependency-size'.
1 files changed, 12 insertions(+), 2 deletions(-)

M guix/scripts/size.scm
M guix/scripts/size.scm => guix/scripts/size.scm +12 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 34,6 34,7 @@
  #:use-module (srfi srfi-37)
  #:use-module (ice-9 match)
  #:use-module (ice-9 format)
  #:use-module (ice-9 vlist)
  #:export (profile?
            profile-file
            profile-self-size


@@ 142,11 143,20 @@ profile of ITEMS and their requisites."
                                           (lambda (size)
                                             (return (cons item size)))))
                                    refs)))
    (define size-table
      (fold (lambda (pair result)
              (match pair
                ((item . size)
                 (vhash-cons item size result))))
            vlist-null sizes))

    (define (dependency-size item)
      (mlet %store-monad ((deps (requisites* (list item))))
        (foldm %store-monad
               (lambda (item total)
                 (return (+ (assoc-ref sizes item) total)))
                 (return (+ (match (vhash-assoc item size-table)
                              ((_ . size) size))
                            total)))
               0
               (delete-duplicates (cons item deps)))))