commit: increase perf by avoiding checks against entire repo subsets stable
authorDurham Goode <durham@fb.com>
Fri, 16 Nov 2012 15:39:12 -0800
branchstable
changeset 17952 54cedee86e51
parent 17951 6f79c32c0bdf
child 17953 49c85541617b
child 17961 b0affcb67cba
commit: increase perf by avoiding checks against entire repo subsets When commiting to a repo with lots of history (>400000 changesets) checking the results of revset.py:descendants against the subset takes some time. Since the subset equals the entire changelog, the check isn't necessary. Avoiding it in that case saves 0.1 seconds off of a 1.78 second commit. A 6% gain. We use the length of the subset to determine if it is the entire repo. There is precedence for this in revset.py:stringset.
mercurial/revset.py
--- a/mercurial/revset.py	Fri Nov 16 15:39:12 2012 -0800
+++ b/mercurial/revset.py	Fri Nov 16 15:39:12 2012 -0800
@@ -571,6 +571,14 @@
     if not args:
         return []
     s = set(_revdescendants(repo, args, followfirst)) | set(args)
+
+    if len(subset) == len(repo):
+        # the passed in revisions may not exist, -1 for example
+        for arg in args:
+            if arg not in subset:
+                s.remove(arg)
+        return list(s)
+
     return [r for r in subset if r in s]
 
 def descendants(repo, subset, x):
@@ -1328,7 +1336,10 @@
     Changesets in set with no parent changeset in set.
     """
     s = set(getset(repo, repo.changelog, x))
-    subset = [r for r in subset if r in s]
+    if len(subset) == len(repo):
+        subset = s
+    else:
+        subset = [r for r in subset if r in s]
     cs = _children(repo, subset, s)
     return [r for r in subset if r not in cs]