[PATCH] revset: improve head revset performance

Durham Goode durham at fb.com
Thu Mar 13 16:32:42 CDT 2014


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1394743641 25200
#      Thu Mar 13 13:47:21 2014 -0700
# Node ID 4a6fb092c3172b1c7f0df59f49f307a19005326e
# Parent  1cd5bff45db28150d7c140be493fe851e6560f27
revset: improve head revset performance

Previously the head() revset would iterate over every item in the subset and
check if it was a head.  Since the subset is often the entire repo, this was
slow on large repos. Now we iterate over each item in the head list and check if
it's in the subset, which results in much less work.

hg log -r 'head()' on a large repo:
Before: 0.95s
After: 0.28s

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -941,7 +941,7 @@
     hs = set()
     for b, ls in repo.branchmap().iteritems():
         hs.update(repo[h].rev() for h in ls)
-    return subset.filter(lambda r: r in hs)
+    return lazyset(list(hs), lambda r: r in subset)
 
 def heads(repo, subset, x):
     """``heads(set)``


More information about the Mercurial-devel mailing list