performance: speedup computation of suspended revisions
authorPierre-Yves David <pierre-yves.david@ens-lyon.org>
Fri, 04 Jan 2013 03:15:44 +0100
changeset 18276 834ef7e70d0f
parent 18275 9818f22785b7
child 18277 a58260bc101f
performance: speedup computation of suspended revisions In their current state, revset calls can be very costly, as we test predicates on the entire repository. This change drops a revset call in favor of direct testing of the phase of changesets. Performance test on my Mercurial checkout - 19857 total changesets, - 1584 obsolete changesets, - 13310 obsolescence markers. Before: ! suspended ! wall 0.014319 After: ! suspended ! wall 0.009559 Performance test on a Mozilla central checkout: - 117293 total changesets, - 1 obsolete changeset, - 1 obsolescence marker. Before: ! suspended ! wall 0.033373 After: ! suspended ! wall 0.000053
mercurial/obsolete.py
--- a/mercurial/obsolete.py	Fri Jan 04 03:15:21 2013 +0100
+++ b/mercurial/obsolete.py	Fri Jan 04 03:15:44 2013 +0100
@@ -671,7 +671,8 @@
 @cachefor('suspended')
 def _computesuspendedset(repo):
     """the set of obsolete parents with non obsolete descendants"""
-    return set(repo.revs('obsolete() and obsolete()::unstable()'))
+    suspended = repo.changelog.ancestors(getrevs(repo, 'unstable'))
+    return set(r for r in getrevs(repo, 'obsolete') if r in suspended)
 
 @cachefor('extinct')
 def _computeextinctset(repo):