[PATCH 5 of 5] perf: add a `perfhelper-mergecopies` command

Augie Fackler raf at durin42.com
Tue May 28 09:50:35 EDT 2019


Queued, with copyediting both in commit messages and docstrings.

> On May 23, 2019, at 12:47, Pierre-Yves David <pierre-yves.david at ens-lyon.org> wrote:
> 
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at octobus.net>
> # Date 1558628108 -7200
> #      Thu May 23 18:15:08 2019 +0200
> # Node ID 72771aee91364de80511c22b356b724cde35f73f
> # Parent  2a0e626bc8f1b7ac1cf38789fcc32876f8684f91
> # EXP-Topic perf-mergecopies
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> #              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 72771aee9136
> perf: add a `perfhelper-mergecopies` command
> 
> This command gather data that are useful to pick argument for `perfmergecopies`.
> 
> diff --git a/contrib/perf.py b/contrib/perf.py
> --- a/contrib/perf.py
> +++ b/contrib/perf.py
> @@ -1430,6 +1430,111 @@ def perftemplating(ui, repo, testedtempl
>     timer(format)
>     fm.end()
> 
> + at command(b'perfhelper-mergecopies', formatteropts +
> +         [
> +          (b'r', b'revs', [], b'restrict search to these revisions'),
> +          (b'', b'timing', False, b'provides extra data (costly)'),
> +         ])
> +def perfhelpermergecopies(ui, repo, revs=[], **opts):
> +    """find statistic about potential parameters for `perfmergecopies`
> +
> +    This command find (base, p1, p2) triplet relevant for copytracing
> +    benchmarking in the context of a merge..  It report value for some of the
> +    parameters that impact merge copy tracing time during merge.
> +
> +    If `--timing` is set, rename detection is run and the associated timing
> +    will be reported. The extra details comes at the cost of a slower command
> +    execution.
> +
> +    Since the rename detection is only run once, other factors might easily
> +    affect the precision of the timing. However it should give a good
> +    approximation of which revision triplets are very costly.
> +    """
> +    opts = _byteskwargs(opts)
> +    fm = ui.formatter(b'perf', opts)
> +    dotiming = opts[b'timing']
> +
> +    output_template = [
> +        ("base", "%(base)12s"),
> +        ("p1", "%(p1.node)12s"),
> +        ("p2", "%(p2.node)12s"),
> +        ("p1.nb-revs", "%(p1.nbrevs)12d"),
> +        ("p1.nb-files", "%(p1.nbmissingfiles)12d"),
> +        ("p1.renames", "%(p1.renamedfiles)12d"),
> +        ("p1.time", "%(p1.time)12.3f"),
> +        ("p2.nb-revs", "%(p2.nbrevs)12d"),
> +        ("p2.nb-files", "%(p2.nbmissingfiles)12d"),
> +        ("p2.renames", "%(p2.renamedfiles)12d"),
> +        ("p2.time", "%(p2.time)12.3f"),
> +        ("renames", "%(nbrenamedfiles)12d"),
> +        ("total.time", "%(time)12.3f"),
> +        ]
> +    if not dotiming:
> +        output_template = [i for i in output_template
> +                           if not ('time' in i[0] or 'renames' in i[0])]
> +    header_names = [h for (h, v) in output_template]
> +    output = ' '.join([v for (h, v) in output_template]) + '\n'
> +    header = ' '.join(['%12s'] * len(header_names)) + '\n'
> +    fm.plain(header % tuple(header_names))
> +
> +    if not revs:
> +        revs = ['all()']
> +    revs = scmutil.revrange(repo, revs)
> +
> +    roi = repo.revs('merge() and %ld', revs)
> +    for r in roi:
> +        ctx = repo[r]
> +        p1 = ctx.p1()
> +        p2 = ctx.p2()
> +        bases = repo.changelog._commonancestorsheads(p1.rev(), p2.rev())
> +        for b in bases:
> +            b = repo[b]
> +            p1missing = copies._computeforwardmissing(b, p1)
> +            p2missing = copies._computeforwardmissing(b, p2)
> +            data = {
> +                b'base': b.hex(),
> +                b'p1.node': p1.hex(),
> +                b'p1.nbrevs': len(repo.revs('%d::%d', b.rev(), p1.rev())),
> +                b'p1.nbmissingfiles': len(p1missing),
> +                b'p2.node': p2.hex(),
> +                b'p2.nbrevs': len(repo.revs('%d::%d', b.rev(), p2.rev())),
> +                b'p2.nbmissingfiles': len(p2missing),
> +            }
> +            if dotiming:
> +                begin = util.timer()
> +                mergedata = copies.mergecopies(repo, p1, p2, b)
> +                end = util.timer()
> +                # not very stable timing since we did only one run
> +                data['time'] = end - begin
> +                # mergedata contains five dicts: "copy", "movewithdir",
> +                # "diverge", "renamedelete" and "dirmove".
> +                # The first 4 are about renamed file so lets count that.
> +                renames = len(mergedata[0])
> +                renames += len(mergedata[1])
> +                renames += len(mergedata[2])
> +                renames += len(mergedata[3])
> +                data['nbrenamedfiles'] = renames
> +                begin = util.timer()
> +                p1renames = copies.pathcopies(b, p1)
> +                end = util.timer()
> +                data['p1.time'] = end - begin
> +                begin = util.timer()
> +                p2renames = copies.pathcopies(b, p2)
> +                data['p2.time'] = end - begin
> +                end = util.timer()
> +                data['p1.renamedfiles'] = len(p1renames)
> +                data['p2.renamedfiles'] = len(p2renames)
> +            fm.startitem()
> +            fm.data(**data)
> +            # make node pretty for the human output
> +            out = data.copy()
> +            out['base'] = fm.hexfunc(b.node())
> +            out['p1.node'] = fm.hexfunc(p1.node())
> +            out['p2.node'] = fm.hexfunc(p2.node())
> +            fm.plain(output % out)
> +
> +    fm.end()
> +
> @command(b'perfhelper-pathcopies', formatteropts +
>          [
>           (b'r', b'revs', [], b'restrict search to these revisions'),
> diff --git a/tests/test-contrib-perf.t b/tests/test-contrib-perf.t
> --- a/tests/test-contrib-perf.t
> +++ b/tests/test-contrib-perf.t
> @@ -117,6 +117,8 @@ perfstatus
>    perffncachewrite
>                  (no help text available)
>    perfheads     benchmark the computation of a changelog heads
> +   perfhelper-mergecopies
> +                 find statistic about potential parameters for 'perfmergecopies'
>    perfhelper-pathcopies
>                  find statistic about potential parameters for the
>                  'perftracecopies'
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list