diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -2282,6 +2282,61 @@ def perfbranchmap(ui, repo, *filternames
branchcachewrite.restore()
fm.end()
+@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 revs to 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(b'no revisions selected for --base')
+ if not targetrevs:
+ raise error.Abort(b'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 = b'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 revs to
+ revs
perfbundleread
Benchmark reading of bundle files.
perfcca (no help text available)
@@ -145,6 +148,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