[PATCH 12 of 13] perf: start from an existing branchmap if possible
Boris Feld
boris.feld at octobus.net
Fri Nov 23 09:09:08 EST 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1542834707 0
# Wed Nov 21 21:11:47 2018 +0000
# Node ID ef17ac4ed0534a809c978c5677355d436ce90db9
# Parent b0c7cead9b4e1c872b7bc8983a122cfb630045b6
# EXP-Topic perf-branchmap
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r ef17ac4ed053
perf: start from an existing branchmap if possible
If the --base set if a superset of one of the cached branchmap, we should use as
a starting point. This greatly help the overall runtime of
`hg perfbranchmapupdate`
For example, for a repository with about 500 000 revisions, using this trick
make the command runtime move from about 200 second to about 10 seconds. A 20x
gain.
diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -2248,8 +2248,22 @@ def perfbranchmapupdate(ui, repo, base=(
baserepo = repo.filtered('__perf_branchmap_update_base')
targetrepo = repo.filtered('__perf_branchmap_update_target')
- base = branchmap.branchcache()
- base.update(baserepo, allbaserevs)
+ # try to find an existing branchmap to reuse
+ subsettable = getbranchmapsubsettable()
+ candidatefilter = subsettable.get(None)
+ while candidatefilter is not None:
+ candidatebm = repo.filtered(candidatefilter).branchmap()
+ if candidatebm.validfor(baserepo):
+ filtered = repoview.filterrevs(repo, candidatefilter)
+ missing = [r for r in allbaserevs if r in filtered]
+ base = candidatebm.copy()
+ base.update(baserepo, missing)
+ break
+ candidatefilter = subsettable.get(candidatefilter)
+ else:
+ # no suitable subset where found
+ base = branchmap.branchcache()
+ base.update(baserepo, allbaserevs)
def setup():
x[0] = base.copy()
More information about the Mercurial-devel
mailing list