stablerange: cache parents
We happens to be doing and awful amount of parent call. We cache them locally
for efficiency.
--- a/hgext3rd/evolve/stablerange.py Thu Mar 23 12:53:39 2017 +0100
+++ b/hgext3rd/evolve/stablerange.py Fri Mar 24 05:15:25 2017 +0100
@@ -174,6 +174,8 @@
# the revision computed anyway, and passing that knowledge around might
# help to slice one of its subranges also containings a merge.
self._revsinrangecache = {}
+ # caching parent call # as we do so many of them
+ self._parentscache = {}
def warmup(self, repo, heads):
"""warm the cache up to 'heads'"""
@@ -194,7 +196,7 @@
if revdepth is not None:
stack.pop()
continue
- p1, p2 = cl.parentrevs(current)
+ p1, p2 = self._parents(current, cl.parentrevs)
if p1 == nullrev:
# root case
revdepth = 1
@@ -249,6 +251,13 @@
assert len(revs) == self.rangelength(repo, rangeid)
return revs
+ def _parents(self, rev, func):
+ parents = self._parentscache.get(rev)
+ if parents is None:
+ parents = func(rev)
+ self._parentscache[rev] = parents
+ return parents
+
@staticmethod
def _depthmerge(cl, rev, p1, p2, stack, cache):
# sub method to simplify the main 'depthrev' one
@@ -319,7 +328,7 @@
This function also have the important task to update the revscache of
the parent revs if possible and needed"""
# is this is a merge, there is not need to prepare the parents.
- p1, p2 = repo.changelog.parentrevs(rangeid[0])
+ p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs)
if p2 != nodemod.nullrev:
return None
parentrange = (p1, rangeid[1])
@@ -354,7 +363,7 @@
return slicepoint
def _slicesrangeat(self, repo, rangeid, globalindex):
- p1, p2 = repo.changelog.parentrevs(rangeid[0])
+ p1, p2 = self._parents(rangeid[0], repo.changelog.parentrevs)
if p2 != nodemod.nullrev:
return self._slicesrangeatmerge(repo, rangeid, globalindex)
assert p1 != nodemod.nullrev
@@ -402,9 +411,10 @@
else:
bheads = set(bottomrevs)
parentrevs = cl.parentrevs
+ parents = self._parents
du = bheads.difference_update
for r in bottomrevs:
- du(parentrevs(r))
+ du(parents(r, parentrevs))
# if len(bheads) == 1:
# assert 1 == len(repo.revs('roots(%ld)', top._revs))
if len(bheads) == 1: