[pypy-svn] r58331 - in pypy/build/benchmem: . testing
hpk at codespeak.net
hpk at codespeak.net
Mon Sep 22 20:35:57 CEST 2008
Author: hpk
Date: Mon Sep 22 20:35:55 2008
New Revision: 58331
Added:
pypy/build/benchmem/report.py
- copied, changed from r58280, pypy/build/benchmem/benchreport.py
pypy/build/benchmem/runbench.py
- copied, changed from r58280, pypy/build/benchmem/benchtool.py
Removed:
pypy/build/benchmem/benchreport.py
pypy/build/benchmem/benchtool.py
Modified:
pypy/build/benchmem/testing/test_benchtool.py
Log:
tweak things until measuring multiple interpreters and some ascii-reporting works.
The way i am using it currently:
python runbench.py -e "python2.5,pypy-c--optmem,pypy-c--opt3" && python report.py
Copied: pypy/build/benchmem/report.py (from r58280, pypy/build/benchmem/benchreport.py)
==============================================================================
--- pypy/build/benchmem/benchreport.py (original)
+++ pypy/build/benchmem/report.py Mon Sep 22 20:35:55 2008
@@ -1,18 +1,63 @@
import py
import smaps, benchtool
+def asciitable(table):
+ colmax = []
+ for row in table:
+ if not colmax:
+ colmax = [len(str(x)) for x in row]
+ else:
+ colmax = [max(len(str(x)),y) for x,y in zip(row, colmax)]
+ lines = []
+ for row in table:
+ line = []
+ for col,width in zip(row, colmax):
+ line.append("%%-%ds" %(width) %(col))
+ lines.append(" ".join(line))
+ return "\n".join(lines)
+
+def maxtable_overview(reader):
+ tw = py.io.TerminalWriter()
+
+ for name, results in reader.name2results.items():
+ tw.sep("=", name)
+ row0 = "executable maxpdirty maxrss".split()
+ rows = [row0]
+ for result in results:
+ rows.append([result.executable,
+ result.max("private_dirty"),
+ result.max("rss"),
+ ])
+ tw.line(asciitable(rows))
+
+def checkpointdetails(reader):
+ tw = py.io.TerminalWriter()
+ for name, results in reader.name2results.items():
+ tw.sep("=", "private_dirty at checkpoints: %s" %(name,))
+ row0 = ["num"] + [result.executable for result in results]
+
+ numsnapshosts = len(results[0].snapshots)
+ rows = [row0]
+ for i in range(numsnapshosts):
+ row = [i]
+ for result in results:
+ row.append(result.snapshots[i].private_dirty)
+ rows.append(row)
+ tw.line(asciitable(rows))
+
if __name__ == "__main__":
benchlog = py.path.local("bench.log")
reader = benchtool.LogReader()
reader.parse_logfile(benchlog)
- tw = py.io.TerminalWriter()
+ maxtable_overview(reader)
+ checkpointdetails(reader)
- for name, results in reader.name2results.items():
- tw.sep("=", name)
- for result in results:
- print "%-30s max dirty = %s + %s" % (
- result.executable,
- result.max("shared_dirty"),
- result.max("private_dirty")
- )
+ #for name, results in reader.name2results.items():
+ # tw.sep("=", name)
+ # for result in results:
+ # print "%-30s max dirty = %s + %s" % (
+ # result.executable,
+ # result.max("shared_dirty"),
+ # result.max("private_dirty")
+ ### )
Copied: pypy/build/benchmem/runbench.py (from r58280, pypy/build/benchmem/benchtool.py)
==============================================================================
--- pypy/build/benchmem/benchtool.py (original)
+++ pypy/build/benchmem/runbench.py Mon Sep 22 20:35:55 2008
@@ -44,11 +44,12 @@
write("c")
sys.stdin.read(1)
if __name__ == "__main__":
- import os, sys
+ import os, sys, gc
pid = os.getpid()
write(str(pid) + "\\n")
checkpoint()
%s(checkpoint, %s)
+ gc.collect() # XXX
checkpoint()
write("F")
sys.stdin.close()
@@ -57,7 +58,7 @@
p.write(source)
return p
- def writeexecinfo(self, benchname, args):
+ def write_benchheader(self, benchname, args):
print >>self.logstream, self.SEPBENCH
print >>self.logstream, "#executable=%r" %(str(self.executable ),)
print >>self.logstream, "#benchname=%r" %(benchname,)
@@ -71,7 +72,7 @@
stdout, stdin = os.popen2(cmd)
pid = int(stdin.readline())
- self.writeexecinfo(benchpyfile.basename, args)
+ self.write_benchheader(benchpyfile.basename, args)
rec = smaps.SmapsRecorder(pid, self.logstream)
self.interact_with_child_checkpoints(rec, stdout, stdin)
@@ -102,7 +103,7 @@
def parse_logfile(self, logpath):
f = logpath.open()
for result in BenchmarkResult.parse(f):
- print "parsed", result
+ #print "parsed", result
l = self.name2results.setdefault(result.benchname, [])
l.append(result)
f.close()
@@ -177,15 +178,6 @@
parser.add_option("-l", "--benchlog", action="store", dest="benchlog", default="bench.log",
help="logfile for recording benchmark measurements")
-def getexecutable(options):
- executable = options.executable
- if os.sep not in executable:
- executable = py.path.local.sysfind("python2.5")
- assert executable, "%s not found" %(executable)
- executable = py.path.local(executable)
- assert executable.check(), "%s does not exist" % executable
- return executable
-
def getbenchfiles(options, args):
if args:
benchfiles = [py.path.local(x) for x in args]
@@ -207,11 +199,17 @@
if __name__ == '__main__':
(options, args) = parser.parse_args()
- executable = getexecutable(options)
names = getbenchfiles(options, args)
benchlog = getbenchlog(options)
-
- runner = BenchRunner(executable, benchlog)
- for name in names:
- runner.run_checkpointed_bench(name, (100, 1000))
+ for executable in options.executable.split(","):
+ if not executable:
+ continue
+ p = py.path.local(executable)
+ if not p.check():
+ p = py.path.local.sysfind(executable)
+ if not p.check():
+ raise SystemExit("could not find %r"% (executable))
+ runner = BenchRunner(executable, benchlog)
+ for name in names:
+ runner.run_checkpointed_bench(name, (100, 1000))
print "bench results append to -->>>", benchlog
Modified: pypy/build/benchmem/testing/test_benchtool.py
==============================================================================
--- pypy/build/benchmem/testing/test_benchtool.py (original)
+++ pypy/build/benchmem/testing/test_benchtool.py Mon Sep 22 20:35:55 2008
@@ -1,7 +1,7 @@
import py
import os, sys
-import benchtool
+import runbench
import smaps
def setup_module(mod):
@@ -28,10 +28,10 @@
def checker(path, *args):
if log.check():
log.remove()
- runner = benchtool.BenchRunner(executable="python2.5", benchlog=log)
+ runner = runbench.BenchRunner(executable="python2.5", benchlog=log)
runner.run_checkpointed_bench(path, args)
assert log.check()
- benchresult = benchtool.LogReader()
+ benchresult = runbench.LogReader()
benchresult.parse_logfile(log)
#assert reader.executable
#assert reader.executable
@@ -40,7 +40,7 @@
assert len(results) == 1
assert len(results[0].snapshots) == 10 + 2
- for path in benchtool.benchmarkdir.listdir("*.py"):
+ for path in runbench.benchmarkdir.listdir("*.py"):
if path.basename[0] != "_":
yield checker, path, 10, 10
@@ -67,6 +67,27 @@
assert l0 == "16,8,0,0,0,8 402c2000-402c4000 rw-p 402c2000 00:00 0"
assert lines[1] == smaps.SmapsRecorder.SEPSNAPSHOT.strip()
+ py.test.skip("implement denser/delta format sometime")
+ rec.snapshot() # delta format does not produce anything for identical snapshots
+ result2 = io.getvalue()
+ assert result == result2
+
+ p.write(py.std.textwrap.dedent("""\
+ 402c2000-402c4000 rw-p 402c2000 00:00 0
+ Size: 32 kB
+ Rss: 32 kB
+ Shared_Clean: 0 kB
+ Shared_Dirty: 0 kB
+ Private_Clean: 0 kB
+ Private_Dirty: 32 kB"""))
+
+ rec.snapshot()
+ result = io.getvalue()
+ lines = result.split("\n")
+ assert lines[1].strip() == "CHECKPOINT 2"
+ l2 = " ".join(lines[2].split())
+ assert l2 == "32,32,0,0,0,32 402c2000-402c4000 rw-p 402c2000 00:00 0"
+
def test_parse_mapping():
line = ("988,796,0,0,796,0 08048000-0813f000 "
"r-xp 00000000 fd:00 75457 sometext")
@@ -86,11 +107,10 @@
def test_summing():
line = ("988,796,0,0,796,0 08048000-0813f000 "
"r-xp 00000000 fd:00 75457 sometext")
- snap = benchtool.Snapshot([smaps.Mapping(line), smaps.Mapping(line)])
+ snap = runbench.Snapshot([smaps.Mapping(line), smaps.Mapping(line)])
for name in ('size rss shared_clean shared_dirty '
'private_clean private_dirty').split():
sumval = getattr(snap, name)
val1 = getattr(snap.mappings[0], name)
val2 = getattr(snap.mappings[1], name)
assert sumval == val1 + val2
-
More information about the Pypy-commit
mailing list