Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 25620:5f87f2305ad0
revset: translate node directly with changelog in 'head'
Using 'repo[X]' is much slower because it creates a 'changectx' object and goes
though multiple layers of code to do so. It is also error prone if there is
tags, bookmarks, branch or other names that could map to a node hash and take
precedence (user are wicked).
This provides a significant performance boost on repository with a lot of
heads. Benchmark result for a repo with 1181 heads.
revset: head()
plain min last reverse
0) 0.014853 0.014371 0.014350 0.015161
1) 0.001402 9% 0.000975 6% 0.000874 6% 0.001415 9%
revset: head() - public()
plain min last reverse
0) 0.015121 0.014420 0.014560 0.015028
1) 0.001674 11% 0.001109 7% 0.000980 6% 0.001693 11%
revset: draft() and head()
plain min last reverse
0) 0.015976 0.014490 0.014214 0.015892
1) 0.002335 14% 0.001018 7% 0.000887 6% 0.002340 14%
The speed up is visible even when other more costly revset are in use
revset: head() and author("mpm")
plain min last reverse
0) 0.105419 0.090046 0.017169 0.108180
1) 0.090721 86% 0.077602 86% 0.003556 20% 0.093324 86%
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Tue, 16 Jun 2015 19:47:46 -0700 |
parents | 833fa28cd949 |
children | 21a874693619 |
comparison
equal
deleted
inserted
replaced
25619:833fa28cd949 | 25620:5f87f2305ad0 |
---|---|
1105 Changeset is a named branch head. | 1105 Changeset is a named branch head. |
1106 """ | 1106 """ |
1107 # i18n: "head" is a keyword | 1107 # i18n: "head" is a keyword |
1108 getargs(x, 0, 0, _("head takes no arguments")) | 1108 getargs(x, 0, 0, _("head takes no arguments")) |
1109 hs = set() | 1109 hs = set() |
1110 cl = repo.changelog | |
1110 for b, ls in repo.branchmap().iteritems(): | 1111 for b, ls in repo.branchmap().iteritems(): |
1111 hs.update(repo[h].rev() for h in ls) | 1112 hs.update(cl.rev(h) for h in ls) |
1112 # XXX using a set to feed the baseset is wrong. Sets are not ordered. | 1113 # XXX using a set to feed the baseset is wrong. Sets are not ordered. |
1113 # This does not break because of other fullreposet misbehavior. | 1114 # This does not break because of other fullreposet misbehavior. |
1114 # XXX We should not be using '.filter' here, but combines subset with '&' | 1115 # XXX We should not be using '.filter' here, but combines subset with '&' |
1115 # XXX We should combine with subset first: 'subset & baseset(...)'. This is | 1116 # XXX We should combine with subset first: 'subset & baseset(...)'. This is |
1116 # necessary to ensure we preserve the order in subset. | 1117 # necessary to ensure we preserve the order in subset. |