Add contrib/perf.py for performance testing
authorMatt Mackall <mpm@selenic.com>
Thu, 13 Nov 2008 12:52:03 -0600
changeset 7366 eb240755386d
parent 7365 ec3aafa84d44
child 7367 ad0eb8762458
Add contrib/perf.py for performance testing
contrib/perf.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/perf.py	Thu Nov 13 12:52:03 2008 -0600
@@ -0,0 +1,117 @@
+# perf.py - performance test routines
+
+from mercurial.i18n import _
+from mercurial import cmdutil, match
+import time, os, sys
+
+def timer(func):
+    results = []
+    begin = time.time()
+    count = 0
+    while 1:
+        ostart = os.times()
+        cstart = time.time()
+        r = func()
+        cstop = time.time()
+        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:
+            break
+    if r:
+        sys.stderr.write("! result: %s\n" % r)
+    m = min(results)
+    sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
+                     % (m[0], m[1] + m[2], m[1], m[2], count))
+
+def perfwalk(ui, repo, *pats):
+    try:
+        m = cmdutil.match(repo, pats, {})
+        timer(lambda: len(list(repo.dirstate.walk(m, True, False))))
+    except:
+        try:
+            m = cmdutil.match(repo, pats, {})
+            timer(lambda: len([b for a,b,c in repo.dirstate.statwalk([], m)]))
+        except:
+            timer(lambda: len(list(cmdutil.walk(repo, pats, {}))))
+
+def perfstatus(ui, repo, *pats):
+    #m = match.always(repo.root, repo.getcwd())
+    #timer(lambda: sum(map(len, repo.dirstate.status(m, False, False, False))))
+    timer(lambda: sum(map(len, repo.status())))
+
+def perfheads(ui, repo):
+    timer(lambda: len(repo.changelog.heads()))
+
+def perftags(ui, repo):
+    import mercurial.changelog, mercurial.manifest
+    def t():
+        repo.changelog = mercurial.changelog.changelog(repo.sopener)
+        repo.manifest = mercurial.manifest.manifest(repo.sopener)
+        repo.tagscache = None
+        return len(repo.tags())
+    timer(t)
+
+def perfdirstate(ui, repo):
+    "a" in repo.dirstate
+    def d():
+        repo.dirstate.invalidate()
+        "a" in repo.dirstate
+    timer(d)
+
+def perfdirstatedirs(ui, repo):
+    "a" in repo.dirstate
+    def d():
+        "a" in repo.dirstate._dirs
+        del repo.dirstate._dirs
+    timer(d)
+
+def perfmanifest(ui, repo):
+    def d():
+        t = repo.manifest.tip()
+        m = repo.manifest.read(t)
+        repo.manifest.mapcache = None
+        repo.manifest._cache = None
+    timer(d)
+
+def perfindex(ui, repo):
+    import mercurial.changelog
+    def d():
+        t = repo.changelog.tip()
+        repo.changelog = mercurial.changelog.changelog(repo.sopener)
+        repo.changelog._loadindexmap()
+    timer(d)
+
+def perfstartup(ui, repo):
+    cmd = sys.argv[0]
+    def d():
+        os.system("HGRCPATH= %s version -q > /dev/null" % cmd)
+    timer(d)
+
+def perfparents(ui, repo):
+    nl = [repo.changelog.node(i) for i in xrange(1000)]
+    def d():
+        for n in nl:
+            repo.changelog.parents(n)
+    timer(d)
+
+def perflookup(ui, repo, rev):
+    timer(lambda: len(repo.lookup(rev)))
+
+cmdtable = {
+    'perflookup': (perflookup, []),
+    'perfparents': (perfparents, []),
+    'perfstartup': (perfstartup, []),
+    'perfstatus': (perfstatus, []),
+    'perfwalk': (perfwalk, []),
+    'perfmanifest': (perfmanifest, []),
+    'perfindex': (perfindex, []),
+    'perfheads': (perfheads, []),
+    'perftags': (perftags, []),
+    'perfdirstate': (perfdirstate, []),
+    'perfdirstatedirs': (perfdirstate, []),
+}
+