[pypy-svn] r59522 - in pypy/build/benchmem: . testing
fijal at codespeak.net
fijal at codespeak.net
Wed Oct 29 16:53:06 CET 2008
Author: fijal
Date: Wed Oct 29 16:53:05 2008
New Revision: 59522
Modified:
pypy/build/benchmem/runbench.py
pypy/build/benchmem/testing/test_benchtool.py
pypy/build/benchmem/testing/test_tracing.py
pypy/build/benchmem/tracer.py
Log:
Some support for measurments of perceived pauses
Modified: pypy/build/benchmem/runbench.py
==============================================================================
--- pypy/build/benchmem/runbench.py (original)
+++ pypy/build/benchmem/runbench.py Wed Oct 29 16:53:05 2008
@@ -11,6 +11,7 @@
import py
import smaps
+import time
optparse = py.compat.optparse
mydir = py.magic.autopath().dirpath()
@@ -37,6 +38,15 @@
l.sort()
return l
+ def write_benchheader(self, benchname, args):
+ print >>self.logstream, self.SEPBENCH
+ print >>self.logstream, "#benchtype=%s" % (self.benchtype,)
+ print >>self.logstream, "#executable=%s" %(str(self.executable ),)
+ print >>self.logstream, "#benchpath=%s" %(self.benchpath.basename,)
+ print >>self.logstream, "#benchname=%s" %(benchname,)
+ print >>self.logstream, "#benchargs=%s" %(args,)
+ print >>self.logstream
+
def log(self, *args):
print " ".join(map(str, args))
@@ -104,6 +114,8 @@
class BenchRunnerObjsize(BenchRunner):
+ benchtype = 'objsizes'
+
def __init__(self, executable, logpath, options):
BenchRunner.__init__(self, executable, logpath, options)
self.benchpath = benchmarkdir.join("sizes.py")
@@ -137,15 +149,6 @@
p.write(source)
return p
- def write_benchheader(self, benchname, args):
- print >>self.logstream, self.SEPBENCH
- print >>self.logstream, "#benchtype=objsizes"
- print >>self.logstream, "#executable=%s" %(str(self.executable ),)
- print >>self.logstream, "#benchpath=%s" %(self.benchpath.basename,)
- print >>self.logstream, "#benchname=%s" %(benchname,)
- print >>self.logstream, "#benchargs=%s" %(args,)
- print >>self.logstream
-
def run(self):
for name in self.getnames():
self.run_checkpointed(name)
@@ -179,20 +182,12 @@
class BenchRunnerAppProfiles(BenchRunner):
ITER2 = 10
+ benchtype = 'appprofiles'
def __init__(self, *args):
BenchRunner.__init__(self, *args)
self.benchpath = benchmarkdir.join("appprofiles.py")
- def write_benchheader(self, benchname, args):
- print >>self.logstream, self.SEPBENCH
- print >>self.logstream, "#benchtype=appprofiles"
- print >>self.logstream, "#executable=%s" %(str(self.executable ),)
- print >>self.logstream, "#benchpath=%s" %(self.benchpath.basename,)
- print >>self.logstream, "#benchname=%s" %(benchname,)
- print >>self.logstream, "#benchargs=%s" %(args,)
- print >>self.logstream
-
def run(self):
for name in self.getnames():
self.run_once(name)
@@ -234,6 +229,40 @@
except py.error.ENOENT:
break
+class BenchRunnerPauses(BenchRunner):
+ benchtype = 'pauses'
+
+ def __init__(self, *args):
+ BenchRunner.__init__(self, *args)
+ self.benchpath = benchmarkdir.join("appprofiles.py")
+ self.last_t = time.time()
+ # XXX
+ self.args = (1000, 3)
+
+ def run(self):
+ for name in self.getnames():
+ self.run_once(name)
+
+ def write_header(self):
+ self.write_benchheader('pauses', self.args)
+
+ def write_footer(self):
+ pass
+
+ def measure(self):
+ t = time.time()
+ diff = t - self.last_t
+ self.logstream.write(str(diff) + "\n")
+ self.last_t = t
+
+ def run_once(self, name):
+ self.write_header()
+ from tracer import trace_in_another_process
+ trace_in_another_process(self.tmpdir.join(self.benchpath.basename),
+ self.benchpath.read(),
+ name, self.measure, self.executable,
+ self.args)
+ self.write_footer()
#
# ================ reading a benchmark log file =======================
@@ -291,7 +320,8 @@
yield parse_result(stream_iter, kw, private_only)
def parse_result(stream, kw, private_only):
- chosen_cls = benchtype2class[kw.pop('benchtype')]
+ benchtype = kw.pop('benchtype')
+ chosen_cls = benchtype2class[benchtype]
return chosen_cls.parse(stream, kw, private_only)
class Result(object):
@@ -372,6 +402,23 @@
timings.append((name, times))
return cls(timings, **kw)
+class PausesResult(Result):
+ benchtype = 'pauses'
+
+ def __init__(self, lst, **kw):
+ for k, v in kw.items():
+ setattr(self, k, v)
+ self.lst = lst
+
+ @classmethod
+ def parse(cls, lnstream, kw, private_only=False):
+ lst = []
+ for lineno, line in lnstream:
+ if line.strip() == BenchRunner.SEPBENCH:
+ break
+ lst.append(float(line))
+ return cls(lst, **kw)
+
benchtype2class = {}
def _update_benchtyp2class():
@@ -475,6 +522,8 @@
return BenchRunnerBaseTime
elif benchtype == "appprofiles":
return BenchRunnerAppProfiles
+ elif benchtype == 'pauses':
+ xxx
else:
raise NotImplementedError("Benchmark type: %s" % (benchtype,))
Modified: pypy/build/benchmem/testing/test_benchtool.py
==============================================================================
--- pypy/build/benchmem/testing/test_benchtool.py (original)
+++ pypy/build/benchmem/testing/test_benchtool.py Wed Oct 29 16:53:05 2008
@@ -59,6 +59,21 @@
assert len(results) == 1
assert len(results[0].snapshots)
+def test_pauses():
+ tmpdir = py.test.ensuretemp("benchrunner")
+ benchlog=tmpdir.join("log_pauses")
+
+ class options:
+ numiter = 10
+ runner = runbench.BenchRunnerPauses("python2.5", benchlog, options)
+ assert runner.benchpath.basename == "appprofiles.py"
+ runner.run()
+ resultset = runbench.ResultSet()
+ resultset.parse(benchlog)
+ for name, results in resultset.getname2results():
+ assert len(results) == 4
+ assert len(results[0].lst)
+
def test_runbench_functional():
script = py.path.local(runbench.__file__).dirpath("runbench.py")
output = py.process.cmdexec("python %s --numiter=10" %(script))
Modified: pypy/build/benchmem/testing/test_tracing.py
==============================================================================
--- pypy/build/benchmem/testing/test_tracing.py (original)
+++ pypy/build/benchmem/testing/test_tracing.py Wed Oct 29 16:53:05 2008
@@ -1,6 +1,6 @@
from tracer import run_with_tracing, trace_in_another_process
-import py
+import py, sys
def test_base_tracing():
def g():
@@ -26,6 +26,7 @@
g()
""")
l = []
- trace_in_another_process(filename, source, 'f', lambda : l.append(None))
+ trace_in_another_process(filename, source, 'f', lambda : l.append(None),
+ sys.executable)
assert len(l) == 503
Modified: pypy/build/benchmem/tracer.py
==============================================================================
--- pypy/build/benchmem/tracer.py (original)
+++ pypy/build/benchmem/tracer.py Wed Oct 29 16:53:05 2008
@@ -7,12 +7,13 @@
return f
return f
-def run_with_tracing(f, func_to_run):
+def run_with_tracing(f, func_to_run, args=()):
sys.settrace(wrapper(func_to_run))
- f()
+ f(*args)
sys.settrace(None)
-def trace_in_another_process(filename, source_code, func_name, measure_func):
+def trace_in_another_process(filename, source_code, func_name, measure_func,
+ executable, args=()):
source = py.code.Source(source_code, """
import sys
sys.path.insert(0, '%s')
@@ -24,14 +25,14 @@
sys.stdin.read(1)
if __name__ == '__main__':
- run_with_tracing(%s, write)
+ run_with_tracing(%s, write, %s)
sys.stdout.write('F')
sys.stdout.flush()
- """ % (py.magic.autopath().dirpath(), func_name))
+ """ % (py.magic.autopath().dirpath(), func_name, args))
f = py.path.local(filename)
f.write(source)
- cmd = "%s -u %s" % (sys.executable, f)
+ cmd = "%s -u %s" % (executable, f)
stdout, stdin = os.popen2(cmd)
while 1:
ch = stdin.read(1)
More information about the Pypy-commit
mailing list