[PATCH] revset: improve head revset performance

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Mar 13 21:38:31 UTC 2014



On 03/13/2014 02:32 PM, Durham Goode 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)

Please use operators.contains into a slowish lambda

http://docs.python.org/2/library/operator.html#operator.contains

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list