diff mercurial/graphmod.py @ 26187:9cf65f43b49b

graphmod: compute slow revset query once prior to reachableroots (issue4782) Because revsets query is evaluated lazily, "list(revs)" may take long for complicated query. So we shouldn't iterate revs many times. This patch is the easiest workaround for the issue4782. We could introduce more aggressive caching, but it wouldn't be as fast as the simple baseset operation. Gregory Szorc said "this makes `hg wip` on my Firefox clone ~4x faster than 3.5.1 (~6.5s to ~1.5s). This is after a regression in @ to ~45s."
author Yuya Nishihara <yuya@tcha.org>
date Tue, 08 Sep 2015 23:00:44 +0900
parents 014044dbd4e8
children 97cb1aeaca78
line wrap: on
line diff
--- a/mercurial/graphmod.py	Mon Sep 07 11:35:40 2015 -0700
+++ b/mercurial/graphmod.py	Tue Sep 08 23:00:44 2015 +0900
@@ -260,6 +260,10 @@
         for mpar in mpars:
             gp = gpcache.get(mpar)
             if gp is None:
+                # precompute slow query as we know reachableroots() goes
+                # through all revs (issue4782)
+                if not isinstance(revs, revset.baseset):
+                    revs = revset.baseset(revs)
                 gp = gpcache[mpar] = revset.reachableroots(repo, revs, [mpar])
             if not gp:
                 parents.append(mpar)