[PATCH 4 of 8 V2] perf: add a `perfbranchmapupdate` command
Boris Feld
boris.feld at octobus.net
Mon Nov 26 18:44:35 UTC 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1542801745 0
# Wed Nov 21 12:02:25 2018 +0000
# Node ID dc3191e230daa615929d41cc410bfb16cfe658d9
# Parent 0adc2c0a0792d4a0015ec0634487ed9e08fd0e7e
# EXP-Topic perf-branchmap
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r dc3191e230da
perf: add a `perfbranchmapupdate` command
This command benchmark the time necessary to update the branchmap between two
sets of revisions. This changeset introduce a first version, doing nothing fancy
regarding cache or other internal details.
diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -2231,6 +2231,61 @@ def perfbranchmap(ui, repo, *filternames
branchcachewrite.restore()
fm.end()
+ at command(b'perfbranchmapupdate', [
+ (b'', b'base', [], b'subset of revision to start from'),
+ (b'', b'target', [], b'subset of revision to end with'),
+ ] + formatteropts)
+def perfbranchmapupdate(ui, repo, base=(), target=(), **opts):
+ """benchmark branchmap update from for <base> revs to <target> revs
+
+ Examples:
+
+ # update for the one last revision
+ $ hg perfbranchmapupdate --base 'not tip' --target 'tip'
+
+ $ update for change coming with a new branch
+ $ hg perfbranchmapupdate --base 'stable' --target 'default'
+ """
+ from mercurial import branchmap
+ opts = _byteskwargs(opts)
+ timer, fm = gettimer(ui, opts)
+ x = [None] # used to pass data between closure
+
+ # we use a `list` here to avoid possible side effect from smartset
+ baserevs = list(scmutil.revrange(repo, base))
+ targetrevs = list(scmutil.revrange(repo, target))
+ if not baserevs:
+ raise error.Abort('no revisions selected for --base')
+ if not targetrevs:
+ raise error.Abort('no revisions selected for --target')
+
+ # make sure the target branchmap also contains the one in the base
+ targetrevs = list(set(baserevs) | set(targetrevs))
+ targetrevs.sort()
+
+ cl = repo.changelog
+ allbaserevs = list(cl.ancestors(baserevs, inclusive=True))
+ allbaserevs.sort()
+ alltargetrevs = frozenset(cl.ancestors(targetrevs, inclusive=True))
+
+ newrevs = list(alltargetrevs.difference(allbaserevs))
+ newrevs.sort()
+
+ msg = 'benchmark of branchmap with %d revisions with %d new ones\n'
+ ui.status(msg % (len(allbaserevs), len(newrevs)))
+
+ base = branchmap.branchcache()
+ base.update(repo, allbaserevs)
+
+ def setup():
+ x[0] = base.copy()
+
+ def bench():
+ x[0].update(repo, newrevs)
+
+ timer(bench, setup=setup)
+ fm.end()
+
@command(b'perfbranchmapload', [
(b'f', b'filter', b'', b'Specify repoview filter'),
(b'', b'list', False, b'List brachmap filter caches'),
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
@@ -57,6 +57,9 @@ perfstatus
benchmark the update of a branchmap
perfbranchmapload
benchmark reading the branchmap
+ perfbranchmapupdate
+ benchmark branchmap update from for <base> revs to <target>
+ revs
perfbundleread
Benchmark reading of bundle files.
perfcca (no help text available)
@@ -144,6 +147,8 @@ perfstatus
$ hg perfbookmarks
$ hg perfbranchmap
$ hg perfbranchmapload
+ $ hg perfbranchmapupdate --base "not tip" --target "tip"
+ benchmark of branchmap with 3 revisions with 1 new ones
$ hg perfcca
$ hg perfchangegroupchangelog
$ hg perfchangegroupchangelog --cgversion 01
More information about the Mercurial-devel
mailing list