[PATCH V3] revset: use smartset minus operator

Martin von Zweigbergk martinvonz at google.com
Wed Feb 24 13:57:15 EST 2016


Pushed to the clowncopter, thanks!

On Wed, Feb 24, 2016 at 10:50 AM Durham Goode <durham at fb.com> wrote:

> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1456339275 28800
> #      Wed Feb 24 10:41:15 2016 -0800
> # Node ID 36d63242b3ccc2322ad09dd778374de275323626
> # Parent  91a827e760df9d9b3d86692c5aa195a3d6ba2208
> revset: use smartset minus operator
>
> Previously, revsets like 'X - Y' were translated to be 'X and not Y'. This
> can
> be expensive, since if Y is a single commit then 'not Y' becomes a huge
> set and
> sometimes the query optimizer doesn't account for it well.
>
> This patch changes revsets to use the built in smartset minus operator,
> which is
> often smarter than 'X and not Y'.
>
> On a large repo this saves 2.2 seconds on rebase and histedit because "X::
> - X"
> becomes almost instant.
>
> Relevant performance numbers from revsetbenchmark.py
>
> revset #13: roots((tip~100::) - (tip~100::tip))
>    plain         min           max           first         last
> reverse       rev..rst      rev..ast      sort          sor..rst
> sor..ast
> 0) 0.001080      0.001107      0.001102      0.001118      0.001121
> 0.001114      0.001141      0.001123      0.001099      0.001123
> 0.001137
> 1) 0.000708  65% 0.000738  66% 0.000735  66% 0.000739  66% 0.000784  69%
> 0.000780  70% 0.000807  70% 0.000756  67% 0.000727  66% 0.000759  67%
> 0.000808  71%
>
> revset #14: roots((0::) - (0::tip))
>    plain         min           max           first         last
> reverse       rev..rst      rev..ast      sort          sor..rst
> sor..ast
> 0) 0.131304      0.079168      0.133129      0.076560      0.048179
> 0.133349      0.049153      0.077097      0.129689      0.076212
> 0.048543
> 1) 0.065066  49% 0.036941  46% 0.066063  49% 0.034755  45% 0.048558
> 0.071091  53% 0.047679      0.034984  45% 0.064572  49% 0.035680  46%
> 0.048508
>
> revset #22: (not public() - obsolete())
>    plain         min           max           first         last
> reverse       rev..rst      rev..ast      sort          sor..rst
> sor..ast
> 0) 0.000139      0.000133      0.000133      0.000138      0.000134
> 0.000155      0.000157      0.000152      0.000157      0.000156
> 0.000153
> 1) 0.000108  77% 0.000129      0.000129      0.000134      0.000132
> 0.000127  81% 0.000151      0.000147      0.000127  80% 0.000152
> 0.000149
>
> revset #25: (20000::) - (20000)
>    plain         min           max           first         last
> reverse       rev..rst      rev..ast      sort          sor..rst
> sor..ast
> 0) 0.050560      0.045513      0.022593      0.043588      0.021909
> 0.045517      0.021822      0.044660      0.049740      0.044227
> 0.021819
> 1) 0.018614  36% 0.000171   0% 0.019659  87% 0.000168   0% 0.015543  70%
> 0.021069  46% 0.015623  71% 0.000180   0% 0.018658  37% 0.000186   0%
> 0.015750  72%
>
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -436,6 +436,9 @@ def dagrange(repo, subset, x, y):
>  def andset(repo, subset, x, y):
>      return getset(repo, getset(repo, subset, x), y)
>
> +def differenceset(repo, subset, x, y):
> +    return getset(repo, subset, x) - getset(repo, subset, y)
> +
>  def orset(repo, subset, *xs):
>      assert xs
>      if len(xs) == 1:
> @@ -2145,6 +2148,7 @@ methods = {
>      "and": andset,
>      "or": orset,
>      "not": notset,
> +    "difference": differenceset,
>      "list": listset,
>      "keyvalue": keyvaluepair,
>      "func": func,
> @@ -2205,6 +2209,9 @@ def optimize(x, small):
>          if isonly(tb, ta):
>              return w, ('func', ('symbol', 'only'), ('list', tb[2],
> ta[1][2]))
>
> +        if tb is not None and tb[0] == 'not':
> +            return wa, ('difference', ta, tb[1])
> +
>          if wa > wb:
>              return w, (op, tb, ta)
>          return w, (op, ta, tb)
> diff --git a/tests/test-revset.t b/tests/test-revset.t
> --- a/tests/test-revset.t
> +++ b/tests/test-revset.t
> @@ -693,12 +693,11 @@ Test opreand of '%' is optimized recursi
>    * optimized:
>    (func
>      ('symbol', 'only')
> -    (and
> +    (difference
>        (range
>          ('symbol', '8')
>          ('symbol', '9'))
> -      (not
> -        ('symbol', '8'))))
> +      ('symbol', '8')))
>    * set:
>    <baseset+ [8, 9]>
>    8
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20160224/8fba6df8/attachment.html>


More information about the Mercurial-devel mailing list