Mercurial > hg
diff tests/test-ancestor.py @ 18091:f7f8159caad3
ancestor: add lazy membership testing to lazyancestors
This also makes the perfancestorset command use lazy membership testing. In a
linear repository with over 400,000 commits, without this patch, hg
perfancestorset takes 0.80 seconds no matter how far behind we're looking.
With this patch, hg perfancestorset -- X takes:
Rev X Time
-1 0.00s
-4000 0.01s
-20000 0.04s
-80000 0.17s
-200000 0.43s
-300000 0.69s
0 0.88s
Thus, for revisions close to tip, we're up to several orders of magnitude
faster. At 0 we're around 10% slower.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Tue, 18 Dec 2012 12:47:20 -0800 |
parents | b3ba69692f8a |
children | 2fa303619b4d |
line wrap: on
line diff
--- a/tests/test-ancestor.py Tue Dec 18 10:14:01 2012 -0800 +++ b/tests/test-ancestor.py Tue Dec 18 12:47:20 2012 -0800 @@ -34,6 +34,9 @@ 13: [8]} pfunc = graph.get +class mockchangelog(object): + parentrevs = graph.get + def runmissingancestors(revs, bases): print "%% ancestors of %s and not of %s" % (revs, bases) print ancestor.missingancestors(revs, bases, pfunc) @@ -70,5 +73,34 @@ runmissingancestors([10, 11, 12], [13]) runmissingancestors([13], [10, 11, 12]) +def genlazyancestors(revs, stoprev=0, inclusive=False): + print ("%% lazy ancestor set for %s, stoprev = %s, inclusive = %s" % + (revs, stoprev, inclusive)) + return ancestor.lazyancestors(mockchangelog, revs, stoprev=stoprev, + inclusive=inclusive) + +def printlazyancestors(s, l): + print [n for n in l if n in s] + +def test_lazyancestors(): + # Empty revs + s = genlazyancestors([]) + printlazyancestors(s, [3, 0, -1]) + + # Standard example + s = genlazyancestors([11, 13]) + printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0]) + + # Including revs + s = genlazyancestors([11, 13], inclusive=True) + printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0]) + + # Test with stoprev + s = genlazyancestors([11, 13], stoprev=6) + printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0]) + s = genlazyancestors([11, 13], stoprev=6, inclusive=True) + printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0]) + if __name__ == '__main__': test_missingancestors() + test_lazyancestors()