revset: make parents() O(number of parents)
Strip executes a revset like this:
max(parents(_intlist('1234\x001235')) - _intlist('1234\x001235'))
Previously the parents() revset would do 'subset & parents' which iterates over
each item in the subset and checks if it's in parents. subset is usually the
entire repo (a spanset) so this takes a while.
Reversing the parameters to be 'parents & subset' means the operation becomes
O(number of parents) instead of O(size of repo). It also means the result gets
evaluated immediately (since parents isn't a lazy set), but I think this is a
win in most scenarios.
This shaves 0.3 seconds off strip (amend/histedit/rebase/etc) for large repositories.
revset #0: parents(20000)
0) obsolete feature not enabled but 54243 markers found!
! wall 0.006256 comb 0.010000 user 0.010000 sys 0.000000 (best of 289)
1) obsolete feature not enabled but 54243 markers found!
! wall 0.000391 comb 0.000000 user 0.000000 sys 0.000000 (best of 4323)
hgrc settings command line options final result
quiet verbo debug quiet verbo debug quiet verbo debug
0 False False False False False False -> False False False
1 True False False False False False -> True False False
2 False True False False False False -> False True False
3 True True False False False False -> False False False
4 False False True False False False -> False True True
5 True False True False False False -> False True True
6 False True True False False False -> False True True
7 True True True False False False -> False True True
8 False False False True False False -> True False False
9 True False False True False False -> True False False
10 False True False True False False -> True False False
11 True True False True False False -> True False False
12 False False True True False False -> True False False
13 True False True True False False -> True False False
14 False True True True False False -> True False False
15 True True True True False False -> True False False
16 False False False False True False -> False True False
17 True False False False True False -> False True False
18 False True False False True False -> False True False
19 True True False False True False -> False True False
20 False False True False True False -> False True False
21 True False True False True False -> False True False
22 False True True False True False -> False True False
23 True True True False True False -> False True False
24 False False False True True False -> False False False
25 True False False True True False -> False False False
26 False True False True True False -> False False False
27 True True False True True False -> False False False
28 False False True True True False -> False False False
29 True False True True True False -> False False False
30 False True True True True False -> False False False
31 True True True True True False -> False False False
32 False False False False False True -> False True True
33 True False False False False True -> False True True
34 False True False False False True -> False True True
35 True True False False False True -> False True True
36 False False True False False True -> False True True
37 True False True False False True -> False True True
38 False True True False False True -> False True True
39 True True True False False True -> False True True
40 False False False True False True -> False True True
41 True False False True False True -> False True True
42 False True False True False True -> False True True
43 True True False True False True -> False True True
44 False False True True False True -> False True True
45 True False True True False True -> False True True
46 False True True True False True -> False True True
47 True True True True False True -> False True True
48 False False False False True True -> False True True
49 True False False False True True -> False True True
50 False True False False True True -> False True True
51 True True False False True True -> False True True
52 False False True False True True -> False True True
53 True False True False True True -> False True True
54 False True True False True True -> False True True
55 True True True False True True -> False True True
56 False False False True True True -> False True True
57 True False False True True True -> False True True
58 False True False True True True -> False True True
59 True True False True True True -> False True True
60 False False True True True True -> False True True
61 True False True True True True -> False True True
62 False True True True True True -> False True True
63 True True True True True True -> False True True