[PATCH] revset: improve head revset performance

Lucas Moscovicz lmoscovicz at fb.com
Thu Mar 13 16:41:00 CDT 2014



On 3/13/14, 2:32 PM, "Durham Goode" <durham at fb.com> wrote:

># 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)

Here you should use baseset(hs) instead of list(hs) since every method
called on that lazyset may actually have to be called on the inner
structure and we want that to be one of our own.

> 
> def heads(repo, subset, x):
>     """``heads(set)``
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at selenic.com
>https://urldefense.proofpoint.com/v1/url?u=http://selenic.com/mailman/list
>info/mercurial-devel&k=ZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r=OvJpSDyvbZ%2BdRIG
>uE%2BQNXdEMu%2FMWX%2BVvreTVxvKUMnE%3D%0A&m=K%2FnZJ7p002Lih1axzNDQ2mAB3tcv%
>2FLXf%2B9BByp4kIBA%3D%0A&s=3626b16fc42c34839996e96ad9fdd64beefe06a93a319f2
>d304605dcf380a1a3



More information about the Mercurial-devel mailing list