mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
66bd74e558
Test Plan: run-tests-.py Reviewers: mitrandir, #mercurial Reviewed By: mitrandir Subscribers: ps, terrelln Differential Revision: https://phabricator.intern.facebook.com/D6675896 Tasks: T24908724 Signature: 6675896:1515448382:df8d80cd7356ae8f5fb04586dc4a0a651bc498fd
84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
# 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.
|
|
'''
|
|
|
|
from mercurial import cmdutil
|
|
import time, os, tempfile
|
|
import functools
|
|
|
|
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()
|