perf.py
259 lines
| 7.4 KiB
| text/x-python
|
PythonLexer
/ contrib / perf.py
Matt Mackall
|
r7366 | # perf.py - performance test routines | ||
Dirkjan Ochtman
|
r8873 | '''helper extension to measure performance''' | ||
Matt Mackall
|
r7366 | |||
Bryan O'Sullivan
|
r16414 | from mercurial import cmdutil, scmutil, util, match, commands | ||
Matt Mackall
|
r7366 | import time, os, sys | ||
Patrick Mezard
|
r9826 | def timer(func, title=None): | ||
Matt Mackall
|
r7366 | results = [] | ||
begin = time.time() | ||||
count = 0 | ||||
Martin Geisler
|
r14494 | while True: | ||
Matt Mackall
|
r7366 | 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 | ||||
Patrick Mezard
|
r9826 | if title: | ||
sys.stderr.write("! %s\n" % title) | ||||
Matt Mackall
|
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: | ||||
Matt Mackall
|
r14671 | m = scmutil.match(repo[None], pats, {}) | ||
Augie Fackler
|
r10176 | timer(lambda: len(list(repo.dirstate.walk(m, [], True, False)))) | ||
Brodie Rao
|
r16689 | except Exception: | ||
Matt Mackall
|
r7366 | try: | ||
Matt Mackall
|
r14671 | m = scmutil.match(repo[None], pats, {}) | ||
Matt Mackall
|
r10282 | timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)])) | ||
Brodie Rao
|
r16689 | except Exception: | ||
Matt Mackall
|
r7366 | timer(lambda: len(list(cmdutil.walk(repo, pats, {})))) | ||
def perfstatus(ui, repo, *pats): | ||||
#m = match.always(repo.root, repo.getcwd()) | ||||
Brodie Rao
|
r16683 | #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False, | ||
# False)))) | ||||
Matt Mackall
|
r7366 | timer(lambda: sum(map(len, repo.status()))) | ||
Bryan O'Sullivan
|
r16785 | def clearcaches(cl): | ||
# behave somewhat consistently across internal API changes | ||||
if util.safehasattr(cl, 'clearcaches'): | ||||
cl.clearcaches() | ||||
elif util.safehasattr(cl, '_nodecache'): | ||||
from mercurial.node import nullid, nullrev | ||||
cl._nodecache = {nullid: nullrev} | ||||
cl._nodepos = None | ||||
Matt Mackall
|
r7366 | def perfheads(ui, repo): | ||
Bryan O'Sullivan
|
r16785 | cl = repo.changelog | ||
def d(): | ||||
len(cl.headrevs()) | ||||
clearcaches(cl) | ||||
timer(d) | ||||
Matt Mackall
|
r7366 | |||
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) | ||||
Greg Ward
|
r9146 | repo._tags = None | ||
Matt Mackall
|
r7366 | return len(repo.tags()) | ||
timer(t) | ||||
Bryan O'Sullivan
|
r16802 | def perfancestors(ui, repo): | ||
heads = repo.changelog.headrevs() | ||||
def d(): | ||||
Bryan O'Sullivan
|
r16866 | for a in repo.changelog.ancestors(heads): | ||
Bryan O'Sullivan
|
r16802 | pass | ||
timer(d) | ||||
Matt Mackall
|
r7366 | 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) | ||||
Bryan O'Sullivan
|
r16788 | def perfdirstatewrite(ui, repo): | ||
ds = repo.dirstate | ||||
"a" in ds | ||||
def d(): | ||||
ds._dirty = True | ||||
ds.write() | ||||
timer(d) | ||||
Matt Mackall
|
r7366 | 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) | ||||
Matt Mackall
|
r16262 | def perfchangeset(ui, repo, rev): | ||
n = repo[rev].node() | ||||
def d(): | ||||
c = repo.changelog.read(n) | ||||
Matt Mackall
|
r16266 | #repo.changelog._cache = None | ||
Matt Mackall
|
r16262 | timer(d) | ||
Matt Mackall
|
r7366 | def perfindex(ui, repo): | ||
Matt Mackall
|
r13255 | import mercurial.revlog | ||
Matt Mackall
|
r13277 | mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg | ||
Matt Mackall
|
r13254 | n = repo["tip"].node() | ||
Matt Mackall
|
r7366 | def d(): | ||
Matt Mackall
|
r16260 | cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i") | ||
cl.rev(n) | ||||
Matt Mackall
|
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))) | ||||
Bryan O'Sullivan
|
r16858 | def perfrevrange(ui, repo, *specs): | ||
revrange = scmutil.revrange | ||||
timer(lambda: len(revrange(repo, specs))) | ||||
Matt Mackall
|
r16309 | def perfnodelookup(ui, repo, rev): | ||
import mercurial.revlog | ||||
mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg | ||||
n = repo[rev].node() | ||||
def d(): | ||||
cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i") | ||||
cl.rev(n) | ||||
timer(d) | ||||
Bryan O'Sullivan
|
r16414 | def perfnodelookup(ui, repo, rev): | ||
import mercurial.revlog | ||||
mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg | ||||
n = repo[rev].node() | ||||
cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i") | ||||
def d(): | ||||
cl.rev(n) | ||||
Bryan O'Sullivan
|
r16785 | clearcaches(cl) | ||
Bryan O'Sullivan
|
r16414 | timer(d) | ||
Alexander Solovyov
|
r9932 | def perflog(ui, repo, **opts): | ||
Alexander Solovyov
|
r7872 | ui.pushbuffer() | ||
Alexander Solovyov
|
r9932 | timer(lambda: commands.log(ui, repo, rev=[], date='', user='', | ||
copies=opts.get('rename'))) | ||||
Alexander Solovyov
|
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() | ||||
Matt Mackall
|
r16386 | def perfcca(ui, repo): | ||
Joshua Redstone
|
r17216 | timer(lambda: scmutil.casecollisionauditor(ui, False, repo.dirstate)) | ||
Matt Mackall
|
r16386 | |||
Bryan O'Sullivan
|
r16403 | def perffncacheload(ui, repo): | ||
Adrian Buehlmann
|
r17780 | s = repo.store | ||
Bryan O'Sullivan
|
r16403 | def d(): | ||
s.fncache._load() | ||||
timer(d) | ||||
def perffncachewrite(ui, repo): | ||||
Adrian Buehlmann
|
r17780 | s = repo.store | ||
Bryan O'Sullivan
|
r16403 | s.fncache._load() | ||
def d(): | ||||
s.fncache._dirty = True | ||||
s.fncache.write() | ||||
timer(d) | ||||
Adrian Buehlmann
|
r17553 | def perffncacheencode(ui, repo): | ||
Adrian Buehlmann
|
r17780 | s = repo.store | ||
Adrian Buehlmann
|
r17553 | s.fncache._load() | ||
def d(): | ||||
for p in s.fncache.entries: | ||||
s.encode(p) | ||||
timer(d) | ||||
Patrick Mezard
|
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) | ||||
Pradeepkumar Gayam
|
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) | ||||
Matt Mackall
|
r7366 | cmdtable = { | ||
Matt Mackall
|
r16386 | 'perfcca': (perfcca, []), | ||
Bryan O'Sullivan
|
r16403 | 'perffncacheload': (perffncacheload, []), | ||
'perffncachewrite': (perffncachewrite, []), | ||||
Adrian Buehlmann
|
r17553 | 'perffncacheencode': (perffncacheencode, []), | ||
Matt Mackall
|
r7366 | 'perflookup': (perflookup, []), | ||
Bryan O'Sullivan
|
r16858 | 'perfrevrange': (perfrevrange, []), | ||
Matt Mackall
|
r16309 | 'perfnodelookup': (perfnodelookup, []), | ||
Matt Mackall
|
r7366 | 'perfparents': (perfparents, []), | ||
'perfstartup': (perfstartup, []), | ||||
'perfstatus': (perfstatus, []), | ||||
'perfwalk': (perfwalk, []), | ||||
'perfmanifest': (perfmanifest, []), | ||||
Matt Mackall
|
r16262 | 'perfchangeset': (perfchangeset, []), | ||
Matt Mackall
|
r7366 | 'perfindex': (perfindex, []), | ||
'perfheads': (perfheads, []), | ||||
'perftags': (perftags, []), | ||||
Bryan O'Sullivan
|
r16802 | 'perfancestors': (perfancestors, []), | ||
Matt Mackall
|
r7366 | 'perfdirstate': (perfdirstate, []), | ||
'perfdirstatedirs': (perfdirstate, []), | ||||
Bryan O'Sullivan
|
r16788 | 'perfdirstatewrite': (perfdirstatewrite, []), | ||
Alexander Solovyov
|
r9932 | 'perflog': (perflog, | ||
[('', 'rename', False, 'ask log to follow renames')]), | ||||
Alexander Solovyov
|
r7872 | 'perftemplating': (perftemplating, []), | ||
Patrick Mezard
|
r9826 | 'perfdiffwd': (perfdiffwd, []), | ||
Nicolas Dumazet
|
r11713 | 'perfrevlog': (perfrevlog, | ||
[('d', 'dist', 100, 'distance between the revisions')], | ||||
"[INDEXFILE]"), | ||||
Matt Mackall
|
r7366 | } | ||