perf: add a `setup` argument to run code outside of the timed section
With this new argument, it is possible to perform special setup and cleanup
outside of code actually timed. This is useful to provide more accurate
benchmark.
--- a/contrib/perf.py Mon Nov 19 23:02:29 2018 +0000
+++ b/contrib/perf.py Mon Nov 19 22:55:07 2018 +0000
@@ -275,7 +275,7 @@
displayall = ui.configbool(b"perf", b"all-timing", False)
return functools.partial(_timer, fm, displayall=displayall), fm
-def stub_timer(fm, func, title=None):
+def stub_timer(fm, func, setup=None, title=None):
func()
@contextlib.contextmanager
@@ -289,12 +289,14 @@
a, b = ostart, ostop
r.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
-def _timer(fm, func, title=None, displayall=False):
+def _timer(fm, func, setup=None, title=None, displayall=False):
gc.collect()
results = []
begin = util.timer()
count = 0
while True:
+ if setup is not None:
+ setup()
with timeone() as item:
r = func()
count += 1