branchmap: issue a single call to `ancestors` for all heads
authorPierre-Yves David <pierre-yves.david@fb.com>
Sat, 30 Aug 2014 12:20:50 +0200
changeset 22356 3c8fb24334e9
parent 22355 731b2a90983b
child 22357 9c3c3dc14a65
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
mercurial/branchmap.py
--- 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]