From 956b59a3470ccfc778e3d5d7afb95ccfd1c393fb Mon Sep 17 00:00:00 2001 From: FUJIWARA Katsunori Date: Sun, 9 Oct 2016 01:03:17 +0900 Subject: [PATCH] perf: avoid actual writing branch cache out correctly Mercurial 2.5 (or 0eb7dcc721cb) introduced "perfbranchmap" command, and tried to avoid actual writing branch cache out by replacing write() of branchcache class in branchmap.py with no-op function (probably, for elimination of noisy and heavy file I/O factor). But its implementation isn't correct, because 0eb7dcc721cb replaced not branchmap.branchcache.write() but branchmap.write(). The latter doesn't exist, even at that change. To avoid actual writing branch cache out correctly, this patch replaces branchmap.branchcache.write() with no-op function. To detect mistake of replacement or change of API in the future quickly, this patch uses safeattrsetter() instead of direct attribute assignment. For similarity between replacements, this patch also changes replacement of branchmap.read(). In this patch, replacement of read()/write() can run safely outside "try" block, because two safeattrsetter() invocations ensure that replacement doesn't cause exception. FYI, the table below compares "base" filter wall time of perfbranchmap on recent mozilla-central repo with each Mercurial version between before and after this patch. ==== ========= ========= ver before after ==== ========= ========= 2.5 18.492334 18.232455 2.6 18.733858 18.156702 2.7 18.245598 18.349210 2.8 18.289070 18.528422 2.9 17.572742 16.989655 3.0 17.406953 17.615012 3.1 17.228419 17.689805 3.2 17.862961 17.718367 3.3 2.632110 2.707960 3.4 3.285683 3.272060 3.5 3.370141 3.352176 3.6 3.366939 3.242455 3.7 3.300778 3.367328 3.8 3.300132 3.267298 3.9 3.418996 3.370265 ==== ========= ========= IMHO, there is no serious overlooking performance regression. --- contrib/perf.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/contrib/perf.py b/contrib/perf.py index 1a308fde63..10c36babd3 100644 --- a/contrib/perf.py +++ b/contrib/perf.py @@ -884,16 +884,17 @@ def perfbranchmap(ui, repo, full=False, **opts): repo.filtered(name).branchmap() # add unfiltered allfilters.append(None) - oldread = branchmap.read - oldwrite = branchmap.branchcache.write + + branchcacheread = safeattrsetter(branchmap, 'read') + branchcachewrite = safeattrsetter(branchmap.branchcache, 'write') + branchcacheread.set(lambda repo: None) + branchcachewrite.set(lambda bc, repo: None) try: - branchmap.read = lambda repo: None - branchmap.write = lambda repo: None for name in allfilters: timer(getbranchmap(name), title=str(name)) finally: - branchmap.read = oldread - branchmap.branchcache.write = oldwrite + branchcacheread.restore() + branchcachewrite.restore() fm.end() @command('perfloadmarkers')