Mercurial > hg
comparison contrib/perf.py @ 30145:113aa6145020
perf: avoid actual writing branch cache out correctly
Mercurial 2.5 (or 9b6ae29d4801) 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 9b6ae29d4801 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.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Sun, 09 Oct 2016 01:03:17 +0900 |
parents | 14031d183048 |
children | 148ccd1d9f2f |
comparison
equal
deleted
inserted
replaced
30144:14031d183048 | 30145:113aa6145020 |
---|---|
882 if not full: | 882 if not full: |
883 for name in allfilters: | 883 for name in allfilters: |
884 repo.filtered(name).branchmap() | 884 repo.filtered(name).branchmap() |
885 # add unfiltered | 885 # add unfiltered |
886 allfilters.append(None) | 886 allfilters.append(None) |
887 oldread = branchmap.read | 887 |
888 oldwrite = branchmap.branchcache.write | 888 branchcacheread = safeattrsetter(branchmap, 'read') |
889 branchcachewrite = safeattrsetter(branchmap.branchcache, 'write') | |
890 branchcacheread.set(lambda repo: None) | |
891 branchcachewrite.set(lambda bc, repo: None) | |
889 try: | 892 try: |
890 branchmap.read = lambda repo: None | |
891 branchmap.write = lambda repo: None | |
892 for name in allfilters: | 893 for name in allfilters: |
893 timer(getbranchmap(name), title=str(name)) | 894 timer(getbranchmap(name), title=str(name)) |
894 finally: | 895 finally: |
895 branchmap.read = oldread | 896 branchcacheread.restore() |
896 branchmap.branchcache.write = oldwrite | 897 branchcachewrite.restore() |
897 fm.end() | 898 fm.end() |
898 | 899 |
899 @command('perfloadmarkers') | 900 @command('perfloadmarkers') |
900 def perfloadmarkers(ui, repo): | 901 def perfloadmarkers(ui, repo): |
901 """benchmark the time to parse the on-disk markers for a repo | 902 """benchmark the time to parse the on-disk markers for a repo |