[PATCH STABLE] context: optimize linkrev adjustment in blockancestors() (issue5538)
gregory.szorc at gmail.com
Tue Apr 25 03:29:31 EDT 2017
On Tue, Apr 25, 2017 at 12:20 AM, Denis Laxalde <denis at laxalde.org> wrote:
> # HG changeset patch
> # User Denis Laxalde <denis.laxalde at logilab.fr>
> # Date 1493051603 -7200
> # Mon Apr 24 18:33:23 2017 +0200
> # Branch stable
> # Node ID b159c904ca10bf48afe271ad4d16ade9d1ca3c40
> # Parent 40cf693fc07d846502f9c15a1602880ca99d7b56
> # Available At http://hg.logilab.org/users/dlaxalde/hg
> # hg pull http://hg.logilab.org/users/dlaxalde/hg -r
> context: optimize linkrev adjustment in blockancestors() (issue5538)
> We set parent._descendantrev = child.rev() when walking parents in
> blockancestors() so that, when linkrev adjustment is perform for these, it
> starts from a close descendant instead of possibly topmost introrev. (See
> `self._adjustlinkrev(self._descendantrev)` in filectx._changeid().)
> This is similar to changeset c82d88dfaf59, which added a "f._changeid"
> instruction in annotate() for the same purpose.
> However, here, we set _descendantrev explicitly instead of relying on the
> '_changeid' cached property being accessed (with effect to set _changeid
> attribute) so that, in _parentfilectx() (called from parents()), we go
> `if '_changeid' in vars(self) [...]` branch in which instruction
> `fctx._descendantrev = self.rev()` finally appears and does what we want.
> With this, we can roughly get a 3x speedup (including in example of
> from mozilla-central repository) on usage of followlines revset (and
> equivalent hgweb request).
I get a 5.4x speedup and the new code is spending 2/3 of CPU time reading
revlogs and ~26% doing this |p._descendantrev = c.rev()| assignment. I'd
say that's a clear win :)
Thank you for improving this.
> diff --git a/mercurial/context.py b/mercurial/context.py
> --- a/mercurial/context.py
> +++ b/mercurial/context.py
> @@ -1214,6 +1214,10 @@ def blockancestors(fctx, fromline, tolin
> # introduced in this revision; no need to go futher in
> # branch.
> + # Set _descendantrev with 'c' (a known descendant) so that,
> + # _adjustlinkrev is called for 'p', it receives this
> + # (as srcrev) instead possibly topmost introrev.
> + p._descendantrev = c.rev()
> visit[p.linkrev(), p.filenode()] = p, linerange1
> if inrange:
> yield c, linerange2
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Mercurial-devel