Mercurial > hg-stable
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)