# HG changeset patch # User Boris Feld # Date 1542834707 0 # Node ID 58355a1de6b34ae1a7d364a1d8b90a19bd6f777b # Parent b059388d976cb086eaf27a63f490fccbf37a90b2 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 -r b059388d976c -r 58355a1de6b3 contrib/perf.py --- a/contrib/perf.py Wed Nov 21 20:35:22 2018 +0000 +++ b/contrib/perf.py Wed Nov 21 21:11:47 2018 +0000 @@ -2347,8 +2347,22 @@ baserepo = repo.filtered(b'__perf_branchmap_update_base') targetrepo = repo.filtered(b'__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()