Mercurial > hg
comparison mercurial/repoview.py @ 18272:95ef7a87c053
performance: speedup computation of hidden revisions
In their current state, revset calls can be very costlys, as we
test predicates on the entire repository. The hidden filter is very
widely used, and needs to be very fast.
This change drops revset calls in favor of direct revision manipulation.
Performance test on my Mercurial checkout
- 19857 total changesets,
- 1584 obsolete changesets,
- 13310 obsolescence markers.
Before:
! hidden
! wall 0.077553
After this changes:
! hidden
! wall 0.011230
Performance test on a Mozilla central checkout:
- 117293 total changesets,
- 1 obsolete changeset,
- 1 obsolescence marker.
Before:
! hidden
! wall 0.389472
After:
! hidden
! wall 0.000079
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Fri, 04 Jan 2013 05:44:01 +0100 |
parents | f54898526aad |
children | a2d54f68e13c |
comparison
equal
deleted
inserted
replaced
18271:67872e939945 | 18272:95ef7a87c053 |
---|---|
7 # GNU General Public License version 2 or any later version. | 7 # GNU General Public License version 2 or any later version. |
8 | 8 |
9 import copy | 9 import copy |
10 import phases | 10 import phases |
11 import util | 11 import util |
12 import obsolete, bookmarks, revset | |
12 | 13 |
13 | 14 |
14 def computehidden(repo): | 15 def computehidden(repo): |
15 """compute the set of hidden revision to filter | 16 """compute the set of hidden revision to filter |
16 | 17 |
17 During most operation hidden should be filtered.""" | 18 During most operation hidden should be filtered.""" |
18 assert not repo.changelog.filteredrevs | 19 assert not repo.changelog.filteredrevs |
19 if repo.obsstore: | 20 hideable = obsolete.getrevs(repo, 'obsolete') |
20 ### hide extinct changeset that are not accessible by any mean | 21 if hideable: |
21 hiddenquery = 'extinct() - ::(parents() + bookmark())' | 22 cl = repo.changelog |
22 return frozenset(repo.revs(hiddenquery)) | 23 firsthideable = min(hideable) |
24 revs = cl.revs(start=firsthideable) | |
25 blockers = [r for r in revset._children(repo, revs, hideable) | |
26 if r not in hideable] | |
27 for par in repo[None].parents(): | |
28 blockers.append(par.rev()) | |
29 for bm in bookmarks.listbookmarks(repo).values(): | |
30 blockers.append(repo[bm].rev()) | |
31 blocked = cl.ancestors(blockers, inclusive=True) | |
32 return frozenset(r for r in hideable if r not in blocked) | |
23 return frozenset() | 33 return frozenset() |
24 | 34 |
25 def computeunserved(repo): | 35 def computeunserved(repo): |
26 """compute the set of revision that should be filtered when used a server | 36 """compute the set of revision that should be filtered when used a server |
27 | 37 |