Mercurial > hg
changeset 22356:3c8fb24334e9
branchmap: issue a single call to `ancestors` for all heads
There is no reason to make multiple calls. This provides a massive speedup for
repo with a lot of heads.
On a strongly headed repo this gives humble speedup in simple case:
from 8.1097 to 5.1051
And massive speedup in other case:
from 7.8787 to 0.1984
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Sat, 30 Aug 2014 12:20:50 +0200 |
parents | 731b2a90983b |
children | 9c3c3dc14a65 |
files | mercurial/branchmap.py |
diffstat | 1 files changed, 5 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/branchmap.py Sat Aug 30 11:39:15 2014 +0200 +++ b/mercurial/branchmap.py Sat Aug 30 12:20:50 2014 +0200 @@ -252,15 +252,11 @@ newheadrevs.sort() bheadset.update(newheadrevs) - # This loop prunes out two kinds of heads - heads that are - # superseded by a head in newheadrevs, and newheadrevs that are not - # heads because an existing head is their descendant. - while newheadrevs: - latest = newheadrevs.pop() - if latest not in bheadset: - continue - ancestors = set(cl.ancestors([latest], min(bheadset))) - bheadset -= ancestors + # This prunes out two kinds of heads - heads that are superseded by + # a head in newheadrevs, and newheadrevs that are not heads because + # an existing head is their descendant. + ancestors = set(cl.ancestors(newheadrevs, min(bheadset))) + bheadset -= ancestors bheadrevs = sorted(bheadset) self[branch] = [cl.node(rev) for rev in bheadrevs] tiprev = bheadrevs[-1]