comparison mercurial/obsolete.py @ 18276:834ef7e70d0f

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
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Fri, 04 Jan 2013 03:15:44 +0100
parents 9818f22785b7
children a58260bc101f
comparison
equal deleted inserted replaced
18275:9818f22785b7 18276:834ef7e70d0f
669 return set(r for r in cl.descendants(obs) if r not in obs) 669 return set(r for r in cl.descendants(obs) if r not in obs)
670 670
671 @cachefor('suspended') 671 @cachefor('suspended')
672 def _computesuspendedset(repo): 672 def _computesuspendedset(repo):
673 """the set of obsolete parents with non obsolete descendants""" 673 """the set of obsolete parents with non obsolete descendants"""
674 return set(repo.revs('obsolete() and obsolete()::unstable()')) 674 suspended = repo.changelog.ancestors(getrevs(repo, 'unstable'))
675 return set(r for r in getrevs(repo, 'obsolete') if r in suspended)
675 676
676 @cachefor('extinct') 677 @cachefor('extinct')
677 def _computeextinctset(repo): 678 def _computeextinctset(repo):
678 """the set of obsolete parents without non obsolete descendants""" 679 """the set of obsolete parents without non obsolete descendants"""
679 return set(repo.revs('obsolete() - obsolete()::unstable()')) 680 return set(repo.revs('obsolete() - obsolete()::unstable()'))