perf: extract the timing of a section in a context manager
This makes it easier to reuse it in other (future) part of the code that
requires their own time management.
--- a/contrib/perf.py Mon Oct 01 17:23:54 2018 +0200
+++ b/contrib/perf.py Tue Oct 02 18:54:06 2018 +0200
@@ -19,6 +19,7 @@
# Mercurial
from __future__ import absolute_import
+import contextlib
import functools
import gc
import os
@@ -273,20 +274,28 @@
def stub_timer(fm, func, title=None):
func()
+@contextlib.contextmanager
+def timeone():
+ r = []
+ ostart = os.times()
+ cstart = util.timer()
+ yield r
+ cstop = util.timer()
+ ostop = os.times()
+ a, b = ostart, ostop
+ r.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
+
def _timer(fm, func, title=None, displayall=False):
gc.collect()
results = []
begin = util.timer()
count = 0
while True:
- ostart = os.times()
- cstart = util.timer()
- r = func()
+ with timeone() as item:
+ r = func()
+ count += 1
+ results.append(item[0])
cstop = util.timer()
- ostop = os.times()
- count += 1
- a, b = ostart, ostop
- results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
if cstop - begin > 3 and count >= 100:
break
if cstop - begin > 10 and count >= 3: