Patchwork phases: really fix native phase computation

login
register
mail settings
Submitter Pierre-Yves David
Date June 11, 2015, 8:47 a.m.
Message ID <d90a36f8c2ef3491391f.1434012442@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/9604/
State Accepted
Headers show

Comments

Pierre-Yves David - June 11, 2015, 8:47 a.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1433989576 25200
#      Wed Jun 10 19:26:16 2015 -0700
# Node ID d90a36f8c2ef3491391ffd811b082def3c85158c
# Parent  19717d3c8f941fdd92725ef1723f39edd981e543
phases: really fix native phase computation

For some reason (probably rebase issue, leprechaun or badly resolved .rej)
1635579f9baf contains only half of the emailed patches and do not fix the bug.
This patch adds the other half and enable the sweet native computation for real.

As expected this provide massive speedup along the board.

revset #0: not public()
   plain         first
0) 0.011960      0.010523
1) 0.000465   3% 0.000492   4%

revset #1: (tip~1000::) - public()
   plain         first
0) 0.025700      0.025169
1) 0.002864  11% 0.001899   7%

revset #2: not public() and branch("default")
   plain         first
0) 0.022842      0.020863
1) 0.011418  49% 0.010948   52%

However, it has a less impact (even bad) on first result time in simple
situation.  This comes from the overhead of building the set and filtering it.
This is especially true on my Mercurial repository (used here) where about 1/3
of the changesets are non public and hidden. This could be mitigated by a
caching of the set and a better usage of smartset in '_notpublic'. (But this
won't happen in this patch because the win is massive everywhere else).

revset #0: not public()
   last
0) 0.000081
1) 0.000493 x6.1 <-- bad impact

revset #1: (tip~1000::) - public()
   last
0) 0.013966
1) 0.002737  19%

revset #2: not public() and branch("default")
   last
0) 0.011021
1) 0.011038

The effect mostly disappear when the number of non-public changesets is small
and/or the repo get bigger. Result for Mozilla central:

Mozilla

revset #0: not public()
   plain         first         last
0) 0.092787      0.084094      0.000080
1) 0.000054   0% 0.000083   0% 0.000083

revset #1: (tip~1000::) - public()
   plain         first         last
0) 0.215607      0.183996      0.124962
1) 0.031620  14% 0.006616   3% 0.031168  24%

revset #2: not public() and branch("default")
   plain         first         last
0) 0.092626      0.082687      0.000162
1) 0.000139   0% 0.000165   0% 0.000167
Augie Fackler - June 12, 2015, 8:56 p.m.
This is queued, thanks.

> On Jun 11, 2015, at 04:47, Pierre-Yves David <pierre-yves.david@ens-lyon.org> wrote:
> 
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david@fb.com>
> # Date 1433989576 25200
> #      Wed Jun 10 19:26:16 2015 -0700
> # Node ID d90a36f8c2ef3491391ffd811b082def3c85158c
> # Parent  19717d3c8f941fdd92725ef1723f39edd981e543
> phases: really fix native phase computation
> 
> For some reason (probably rebase issue, leprechaun or badly resolved .rej)
> 1635579f9baf contains only half of the emailed patches and do not fix the bug.
> This patch adds the other half and enable the sweet native computation for real.
> 
> As expected this provide massive speedup along the board.
> 
> revset #0: not public()
>   plain         first
> 0) 0.011960      0.010523
> 1) 0.000465   3% 0.000492   4%
> 
> revset #1: (tip~1000::) - public()
>   plain         first
> 0) 0.025700      0.025169
> 1) 0.002864  11% 0.001899   7%
> 
> revset #2: not public() and branch("default")
>   plain         first
> 0) 0.022842      0.020863
> 1) 0.011418  49% 0.010948   52%
> 
> However, it has a less impact (even bad) on first result time in simple
> situation.  This comes from the overhead of building the set and filtering it.
> This is especially true on my Mercurial repository (used here) where about 1/3
> of the changesets are non public and hidden. This could be mitigated by a
> caching of the set and a better usage of smartset in '_notpublic'. (But this
> won't happen in this patch because the win is massive everywhere else).
> 
> revset #0: not public()
>   last
> 0) 0.000081
> 1) 0.000493 x6.1 <-- bad impact
> 
> revset #1: (tip~1000::) - public()
>   last
> 0) 0.013966
> 1) 0.002737  19%
> 
> revset #2: not public() and branch("default")
>   last
> 0) 0.011021
> 1) 0.011038
> 
> The effect mostly disappear when the number of non-public changesets is small
> and/or the repo get bigger. Result for Mozilla central:
> 
> Mozilla
> 
> revset #0: not public()
>   plain         first         last
> 0) 0.092787      0.084094      0.000080
> 1) 0.000054   0% 0.000083   0% 0.000083
> 
> revset #1: (tip~1000::) - public()
>   plain         first         last
> 0) 0.215607      0.183996      0.124962
> 1) 0.031620  14% 0.006616   3% 0.031168  24%
> 
> revset #2: not public() and branch("default")
>   plain         first         last
> 0) 0.092626      0.082687      0.000162
> 1) 0.000139   0% 0.000165   0% 0.000167
> 
> diff --git a/mercurial/phases.py b/mercurial/phases.py
> --- a/mercurial/phases.py
> +++ b/mercurial/phases.py
> @@ -176,11 +176,11 @@ class phasecache(object):
>     def _getphaserevsnative(self, repo):
>         repo = repo.unfiltered()
>         nativeroots = []
>         for phase in trackedphases:
>             nativeroots.append(map(repo.changelog.rev, self.phaseroots[phase]))
> -        return repo.changelog.computephasesmapsets(nativeroots)
> +        return repo.changelog.computephases(nativeroots)
> 
>     def _computephaserevspure(self, repo):
>         repo = repo.unfiltered()
>         revs = [public] * len(repo.changelog)
>         self._phaserevs = revs
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/phases.py b/mercurial/phases.py
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -176,11 +176,11 @@  class phasecache(object):
     def _getphaserevsnative(self, repo):
         repo = repo.unfiltered()
         nativeroots = []
         for phase in trackedphases:
             nativeroots.append(map(repo.changelog.rev, self.phaseroots[phase]))
-        return repo.changelog.computephasesmapsets(nativeroots)
+        return repo.changelog.computephases(nativeroots)
 
     def _computephaserevspure(self, repo):
         repo = repo.unfiltered()
         revs = [public] * len(repo.changelog)
         self._phaserevs = revs