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)
--- a/contrib/revsetbenchmarks.txt Fri Sep 12 15:00:51 2014 -0700
+++ b/contrib/revsetbenchmarks.txt Fri Sep 12 14:21:18 2014 -0700
@@ -23,5 +23,6 @@
max(::(tip~20) - obsolete())
roots((0:tip)::)
(not public() - obsolete())
+(_intlist('20000\x0020001')) and merge()
parents(20000)
(20000::) - (20000)
--- a/mercurial/revset.py Fri Sep 12 15:00:51 2014 -0700
+++ b/mercurial/revset.py Fri Sep 12 14:21:18 2014 -0700
@@ -1911,7 +1911,7 @@
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