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'.
This commit is contained in:
Ludovic Courtès 2019-04-06 14:52:56 +02:00
parent 32c055fd32
commit 1199da08aa
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 12 additions and 2 deletions

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; 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. ;;; This file is part of GNU Guix.
;;; ;;;
@ -34,6 +34,7 @@
#:use-module (srfi srfi-37) #:use-module (srfi srfi-37)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 format) #:use-module (ice-9 format)
#:use-module (ice-9 vlist)
#:export (profile? #:export (profile?
profile-file profile-file
profile-self-size profile-self-size
@ -142,11 +143,20 @@ profile of ITEMS and their requisites."
(lambda (size) (lambda (size)
(return (cons item size))))) (return (cons item size)))))
refs))) refs)))
(define size-table
(fold (lambda (pair result)
(match pair
((item . size)
(vhash-cons item size result))))
vlist-null sizes))
(define (dependency-size item) (define (dependency-size item)
(mlet %store-monad ((deps (requisites* (list item)))) (mlet %store-monad ((deps (requisites* (list item))))
(foldm %store-monad (foldm %store-monad
(lambda (item total) (lambda (item total)
(return (+ (assoc-ref sizes item) total))) (return (+ (match (vhash-assoc item size-table)
((_ . size) size))
total)))
0 0
(delete-duplicates (cons item deps))))) (delete-duplicates (cons item deps)))))