perf.py
166 lines
| 4.9 KiB
| text/x-python
|
PythonLexer
/ contrib / perf.py
|
r7366 | # perf.py - performance test routines | ||
|
r8873 | '''helper extension to measure performance''' | ||
|
r7366 | |||
|
r7872 | from mercurial import cmdutil, match, commands | ||
|
r7366 | import time, os, sys | ||
|
r9826 | def timer(func, title=None): | ||
|
r7366 | 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 | ||||
|
r9826 | if title: | ||
sys.stderr.write("! %s\n" % title) | ||||
|
r7366 | 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, {}) | ||||
|
r10176 | timer(lambda: len(list(repo.dirstate.walk(m, [], True, False)))) | ||
|
r7366 | except: | ||
try: | ||||
m = cmdutil.match(repo, pats, {}) | ||||
|
r10282 | timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)])) | ||
|
r7366 | except: | ||
timer(lambda: len(list(cmdutil.walk(repo, pats, {})))) | ||||
def perfstatus(ui, repo, *pats): | ||||
#m = match.always(repo.root, repo.getcwd()) | ||||
|
r10493 | #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False, False)))) | ||
|
r7366 | 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) | ||||
|
r9146 | repo._tags = None | ||
|
r7366 | 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): | ||||
|
r13255 | import mercurial.revlog | ||
|
r13277 | mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg | ||
|
r13254 | n = repo["tip"].node() | ||
|
r7366 | def d(): | ||
|
r13260 | repo.invalidate() | ||
|
r13254 | repo[n] | ||
|
r7366 | 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))) | ||||
|
r9932 | def perflog(ui, repo, **opts): | ||
|
r7872 | ui.pushbuffer() | ||
|
r9932 | timer(lambda: commands.log(ui, repo, rev=[], date='', user='', | ||
copies=opts.get('rename'))) | ||||
|
r7872 | ui.popbuffer() | ||
def perftemplating(ui, repo): | ||||
ui.pushbuffer() | ||||
timer(lambda: commands.log(ui, repo, rev=[], date='', user='', | ||||
template='{date|shortdate} [{rev}:{node|short}]' | ||||
' {author|person}: {desc|firstline}\n')) | ||||
ui.popbuffer() | ||||
|
r9826 | def perfdiffwd(ui, repo): | ||
"""Profile diff of working directory changes""" | ||||
options = { | ||||
'w': 'ignore_all_space', | ||||
'b': 'ignore_space_change', | ||||
'B': 'ignore_blank_lines', | ||||
} | ||||
for diffopt in ('', 'w', 'b', 'B', 'wB'): | ||||
opts = dict((options[c], '1') for c in diffopt) | ||||
def d(): | ||||
ui.pushbuffer() | ||||
commands.diff(ui, repo, **opts) | ||||
ui.popbuffer() | ||||
title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none') | ||||
timer(d, title) | ||||
|
r11694 | def perfrevlog(ui, repo, file_, **opts): | ||
from mercurial import revlog | ||||
dist = opts['dist'] | ||||
def d(): | ||||
r = revlog.revlog(lambda fn: open(fn, 'rb'), file_) | ||||
for x in xrange(0, len(r), dist): | ||||
r.revision(r.node(x)) | ||||
timer(d) | ||||
|
r7366 | cmdtable = { | ||
'perflookup': (perflookup, []), | ||||
'perfparents': (perfparents, []), | ||||
'perfstartup': (perfstartup, []), | ||||
'perfstatus': (perfstatus, []), | ||||
'perfwalk': (perfwalk, []), | ||||
'perfmanifest': (perfmanifest, []), | ||||
'perfindex': (perfindex, []), | ||||
'perfheads': (perfheads, []), | ||||
'perftags': (perftags, []), | ||||
'perfdirstate': (perfdirstate, []), | ||||
'perfdirstatedirs': (perfdirstate, []), | ||||
|
r9932 | 'perflog': (perflog, | ||
[('', 'rename', False, 'ask log to follow renames')]), | ||||
|
r7872 | 'perftemplating': (perftemplating, []), | ||
|
r9826 | 'perfdiffwd': (perfdiffwd, []), | ||
|
r11713 | 'perfrevlog': (perfrevlog, | ||
[('d', 'dist', 100, 'distance between the revisions')], | ||||
"[INDEXFILE]"), | ||||
|
r7366 | } | ||