# HG changeset patch # User Durham Goode # Date 2014-09-12 21:21:18 # Node ID 186fd06283b4ddf44f9ac5ba3fb03a871f0994c5 # Parent 95af98616aa70e83e9eebaed72083831779f6ae5 revset: lower weight for _intlist function The histedit command uses a revset like: (_intlist('1234\x001235')) and merge() Previously the optimizer gave a weight of 1.5 to the _intlist side (1 for the function, 0.5 for the string) which caused it to process the merge() side first. This caused it to evaluate merge against every commit in the repo, which took 2.5 seconds on a large repo. I changed the weight of _intlist to 0, since it's a trivial calculation, which makes it process intlist first, which makes merge apply only to the revs in the list. Which makes the revset take 0.15 seconds now. Cutting off 2.4 seconds off our histedit performance. >From the revset benchmark: revset #25: (_intlist('20000\x0020001')) and merge() 0) obsolete feature not enabled but 54243 markers found! ! wall 0.036767 comb 0.040000 user 0.040000 sys 0.000000 (best of 100) 1) obsolete feature not enabled but 54243 markers found! ! wall 0.000198 comb 0.000000 user 0.000000 sys 0.000000 (best of 9084) diff --git a/contrib/revsetbenchmarks.txt b/contrib/revsetbenchmarks.txt --- a/contrib/revsetbenchmarks.txt +++ b/contrib/revsetbenchmarks.txt @@ -23,5 +23,6 @@ draft() max(::(tip~20) - obsolete()) roots((0:tip)::) (not public() - obsolete()) +(_intlist('20000\x0020001')) and merge() parents(20000) (20000::) - (20000) diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -1911,7 +1911,7 @@ def optimize(x, small): w = 100 # very slow elif f == "ancestor": w = 1 * smallbonus - elif f in "reverse limit first": + elif f in "reverse limit first _intlist": w = 0 elif f in "sort": w = 10 # assume most sorts look at changelog