guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/04: profiles: Fix pathological performance of 'manifest-transitive-en


From: guix-commits
Subject: 03/04: profiles: Fix pathological performance of 'manifest-transitive-entries'.
Date: Sun, 14 Jun 2020 09:35:12 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 9acac9f9c6452cd76a21e52c7e5a33e8384b82b4
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sun Jun 14 14:51:02 2020 +0200

    profiles: Fix pathological performance of 'manifest-transitive-entries'.
    
    For packages with lots of propagated inputs,
    'manifest-transitive-entries', as called from 'check-for-collisions',
    would exhibit pathological behavior.  For example, "guix install cl-ana"
    wouldn't complete in 1mn; now, it's down to 20s.
    
    The issue was that manifest entries would never be 'equal?' due to the
    delayed field in <manifest-entry>.
    
    * guix/profiles.scm (manifest-transitive-entries): Use a vhash instead
    of a set.  Use 'manifest-entry=?' instead of 'equal?' when checking for
    equality.
---
 guix/profiles.scm | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/guix/profiles.scm b/guix/profiles.scm
index 25ff146..6064820 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -41,7 +41,6 @@
   #:use-module (guix modules)
   #:use-module (guix monads)
   #:use-module (guix store)
-  #:use-module (guix sets)
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
@@ -260,17 +259,17 @@ field."
 recursively."
   (let loop ((entries (manifest-entries manifest))
              (result  '())
-             (visited (set)))                     ;compare with 'equal?'
+             (visited vlist-null))            ;compare with 'manifest-entry=?'
     (match entries
       (()
        (reverse result))
       ((head . tail)
-       (if (set-contains? visited head)
+       (if (vhash-assoc head visited manifest-entry=?)
            (loop tail result visited)
            (loop (append (manifest-entry-dependencies head)
                          tail)
                  (cons head result)
-                 (set-insert head visited)))))))
+                 (vhash-cons head #t visited)))))))
 
 (define (profile-manifest profile)
   "Return the PROFILE's manifest."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]