revset: avoid O(n) lookup of invalid revision in rev() stable
authorYuya Nishihara <yuya@tcha.org>
Thu, 23 Oct 2014 21:53:37 +0900
branchstable
changeset 23078 eb763217152a
parent 23077 605a8cb61a0c
child 23079 c4ce50a3d634
child 23104 6be50066dd5b
revset: avoid O(n) lookup of invalid revision in rev() ba89f7b542c9 was not the final version of that patch. It was really slow because `l not in repo.changelog` iterates revisions up to `l`. Instead, rev() should utilize spanset.__contains__(). revset #0: rev(210000) 0) wall 0.000039 comb 0.000000 user 0.000000 sys 0.000000 (best of 67978) 1) wall 0.002721 comb 0.000000 user 0.000000 sys 0.000000 (best of 1055) 2) wall 0.000059 comb 0.000000 user 0.000000 sys 0.000000 (best of 45599) (0: 3.2-rc, 1: ba89f7b542c9, 2: this patch) Note that the benchmark result described in ba89f7b542c9 is wrong because it is the one of the initial version.
mercurial/revset.py
--- a/mercurial/revset.py	Thu Oct 23 13:44:34 2014 -0500
+++ b/mercurial/revset.py	Thu Oct 23 21:53:37 2014 +0900
@@ -1351,7 +1351,7 @@
     except (TypeError, ValueError):
         # i18n: "rev" is a keyword
         raise error.ParseError(_("rev expects a number"))
-    if l not in repo.changelog:
+    if l not in fullreposet(repo):
         return baseset()
     return subset & baseset([l])