# hggitperf.py - performance test routines """helper extension to measure performance of hg-git operations This requires both the hggit and hggitperf extensions to be enabled and available. """ import functools import os import tempfile import time from edenscm.mercurial import cmdutil cmdtable = {} command = cmdutil.command(cmdtable) # the timer functions are copied from mercurial/contrib/perf.py def gettimer(ui, opts=None): """return a timer function and formatter: (timer, formatter) This functions exist to gather the creation of formatter in a single place instead of duplicating it in all performance command.""" # enforce an idle period before execution to counteract power management time.sleep(ui.configint("perf", "presleep", 1)) if opts is None: opts = {} # redirect all to stderr ui = ui.copy() ui.fout = ui.ferr # get a formatter fm = ui.formatter("perf", opts) return functools.partial(_timer, fm), fm def _timer(fm, func, title=None): results = [] begin = time.time() count = 0 while True: 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 fm.startitem() if title: fm.write("title", "! %s\n", title) if r: fm.write("result", "! result: %s\n", r) m = min(results) fm.plain("!") fm.write("wall", " wall %f", m[0]) fm.write("comb", " comb %f", m[1] + m[2]) fm.write("user", " user %f", m[1]) fm.write("sys", " sys %f", m[2]) fm.write("count", " (best of %d)", count) fm.plain("\n") @command("perfgitloadmap") def perfgitloadmap(ui, repo): timer, fm = gettimer(ui) timer(repo.githandler.load_map) fm.end() @command("perfgitsavemap") def perfgitsavemap(ui, repo): timer, fm = gettimer(ui) repo.githandler.load_map() fd, f = tempfile.mkstemp(prefix=".git-mapfile-", dir=repo.path) basename = os.path.basename(f) try: timer(lambda: repo.githandler.save_map(basename)) finally: os.unlink(f) fm.end()