revset: drop pre-lazyset optimization for stringset of subset == entire repo stable
authorYuya Nishihara <yuya@tcha.org>
Sat, 03 Jan 2015 10:25:08 +0900
branchstable
changeset 23724 aafeaba22826
parent 23721 1b3df5ef5949
child 23726 d944492445fa
child 23734 f4e6475950f1
revset: drop pre-lazyset optimization for stringset of subset == entire repo It was introduced at e44ebd2a142a, where spanset.__contains__() did not exist. Nowadays, we have to pay huge penalty for len(subset). The following example showed that OR operation could be O(n * m^2) (n: len(repo), m: number of OR operators, m >= 2) probably because of filteredset.__len__. revset #0: 0|1|2|3|4|5|6|7|8|9 0) wall 8.092713 comb 8.090000 user 8.090000 sys 0.000000 (best of 3) 1) wall 0.445354 comb 0.450000 user 0.430000 sys 0.020000 (best of 22) 2) wall 0.000389 comb 0.000000 user 0.000000 sys 0.000000 (best of 7347) (0: 3.2.4, 1: 3.1.2, 2: this patch)
mercurial/revset.py
--- a/mercurial/revset.py	Sun Jan 04 15:26:26 2015 -0500
+++ b/mercurial/revset.py	Sat Jan 03 10:25:08 2015 +0900
@@ -255,7 +255,7 @@
     x = repo[x].rev()
     if x == -1 and len(subset) == len(repo):
         return baseset([-1])
-    if len(subset) == len(repo) or x in subset:
+    if x in subset:
         return baseset([x])
     return baseset()