[PATCH 2 of 2] util: add a timed function for use during development

Bryan O'Sullivan bos at serpentine.com
Thu Feb 21 15:33:02 CST 2013


# HG changeset patch
# User Bryan O'Sullivan <bryano at fb.com>
# Date 1361482360 28800
# Node ID 95cb8d7754a7a28f52f82a332bf1163eb6dea202
# Parent  19d3300883ce1407d0b527549a82f25d3f182873
util: add a timed function for use during development

I often want to measure the cost of a function call before/after
an optimization, where using top level "hg --time" timing introduces
enough other noise that I can't tell if my efforts are having an
effect.

This decorator allows a developer to measure a function's cost with
finer granularity.

diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -1872,3 +1872,45 @@ def isatty(fd):
         return fd.isatty()
     except AttributeError:
         return False
+
+timecount = unitcount(
+    (1, 1e3, _('%.0f s')),
+    (100, 1, _('%.1f s')),
+    (10, 1, _('%.2f s')),
+    (1, 1, _('%.3f s')),
+    (100, 1e-3, _('%.1f ms')),
+    (10, 1e-3, _('%.2f ms')),
+    (1, 1e-3, _('%.3f ms')),
+    (100, 1e-6, _('%.1f us')),
+    (10, 1e-6, _('%.2f us')),
+    (1, 1e-6, _('%.3f us')),
+    (100, 1e-9, _('%.1f ns')),
+    (10, 1e-9, _('%.2f ns')),
+    (1, 1e-9, _('%.3f ns')),
+    )
+
+_timenesting = [0]
+
+def timed(func):
+    '''Report the execution time of a function call to stderr.
+
+    During development, use as a decorator when you need to measure
+    the cost of a function, e.g. as follows:
+
+    @util.timed
+    def foo(a, b, c):
+        pass
+    '''
+
+    def wrapper(*args, **kwargs):
+        start = time.time()
+        _timenesting[0] += 2
+        try:
+            return func(*args, **kwargs)
+        finally:
+            elapsed = time.time() - start
+            _timenesting[0] -= 2
+            sys.stderr.write('%s%s: %s\n' %
+                             (' ' * _timenesting[0], func.__name__,
+                              timecount(elapsed)))
+    return wrapper


More information about the Mercurial-devel mailing list