revset.children: ignore rev numbers that are too low
authorSiddharth Agarwal <sid0@fb.com>
Fri, 07 Dec 2012 10:37:43 -0800
changeset 18063 34a1a639d835
parent 18062 1471f5e83686
child 18065 2acd9c14b0d7
revset.children: ignore rev numbers that are too low This replaces unnecessary parentrevs() calls with calculating min(parentset). Even though the min operation is O(size of parentset), since parentrevs is relatively expensive, this tradeoff almost always works in our favour. In a repository with over 400,000 changesets, hg perfrevset "children(X)" takes: Set X Before After -1 0.51s 0.06s -1000: 0.55s 0.08s -10000: 0.56s 0.10s -100000: 0.60s 0.25s -100000:-99000 0.55s 0.19s 0:100000 0.60s 0.61s all() 0.72s 0.74s The relative performance is similar for Mercurial's own repository -- several times faster in most cases, slightly slower for revisions close to 0 and all().
mercurial/revset.py
--- a/mercurial/revset.py	Thu Dec 06 11:21:11 2012 -0800
+++ b/mercurial/revset.py	Fri Dec 07 10:37:43 2012 -0800
@@ -488,8 +488,13 @@
 
 def _children(repo, narrow, parentset):
     cs = set()
+    if not parentset:
+        return cs
     pr = repo.changelog.parentrevs
+    minrev = min(parentset)
     for r in narrow:
+        if r <= minrev:
+            continue
         for p in pr(r):
             if p in parentset:
                 cs.add(r)