# HG changeset patch # User Boris Feld <boris.f...@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() _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel