Mercurial > hg
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()')) |