comparison mercurial/repoview.py @ 18273:a2d54f68e13c

performance: speedup computation of unserved revisions In their current state, revset calls can be very costly, as we test predicates on the entire repository. The "unserved" filter is used in multiple applications, and in particular in some branch cache loading operations. We need to make it fast. This change drops revset calls in favor of direct testing of the phase of a changeset. Performance test on my Mercurial checkout - 19857 total changesets, - 1584 obsolete changesets, - 13310 obsolescence markers. Before: ! unserved ! wall 0.030477 After: ! unserved ! wall 0.011844 Performance test on a Mozilla central checkout: - 117293 total changesets, - 1 obsolete changeset, - 1 obsolescence marker. Before: ! unserved ! wall 0.111259 After: ! unserved ! wall 0.000084
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Fri, 04 Jan 2013 20:19:05 +0100
parents 95ef7a87c053
children 254b708fd37d
comparison
equal deleted inserted replaced
18272:95ef7a87c053 18273:a2d54f68e13c
36 """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
37 37
38 Secret and hidden changeset should not pretend to be here.""" 38 Secret and hidden changeset should not pretend to be here."""
39 assert not repo.changelog.filteredrevs 39 assert not repo.changelog.filteredrevs
40 # fast path in simple case to avoid impact of non optimised code 40 # fast path in simple case to avoid impact of non optimised code
41 if phases.hassecret(repo) or repo.obsstore: 41 hiddens = filteredrevs(repo, 'hidden')
42 return frozenset(repo.revs('hidden() + secret()')) 42 if phases.hassecret(repo):
43 cl = repo.changelog
44 secret = phases.secret
45 getphase = repo._phasecache.phase
46 first = min(cl.rev(n) for n in repo._phasecache.phaseroots[secret])
47 revs = cl.revs(start=first)
48 secrets = set(r for r in revs if getphase(repo, r) >= secret)
49 return frozenset(hiddens | secrets)
50 else:
51 return hiddens
43 return frozenset() 52 return frozenset()
44 53
45 def computemutable(repo): 54 def computemutable(repo):
46 """compute the set of revision that should be filtered when used a server 55 """compute the set of revision that should be filtered when used a server
47 56