[pypy-svn] r67696 - in pypy/build/benchmark: . test
iko at codespeak.net
iko at codespeak.net
Tue Sep 15 16:40:51 CEST 2009
Author: iko
Date: Tue Sep 15 16:40:51 2009
New Revision: 67696
Modified:
pypy/build/benchmark/interpreters.py
pypy/build/benchmark/runner.py
pypy/build/benchmark/test/test_interpreters.py
Log:
clean up a bit
add elapse time default statistic
Modified: pypy/build/benchmark/interpreters.py
==============================================================================
--- pypy/build/benchmark/interpreters.py (original)
+++ pypy/build/benchmark/interpreters.py Tue Sep 15 16:40:51 2009
@@ -1,4 +1,4 @@
-import os, fcntl, gc, select, fcntl, signal, errno
+import os, fcntl, gc, select, fcntl, signal, errno, time
BUFSIZ = 8192
@@ -11,27 +11,31 @@
def __getattr__(self, key):
if key in self._keys:
return self[self._keys.index(key)]
- return tuple.__getattr__(self, key)
+ raise AttributeError("'RUsage' object has no attribute %r" % (key,))
class BaseInterpreter(object):
rusage = None
status = None
cpid = None
pid = None
+ starttime = None
def __init__(self, script):
self.script = script
+ self.statistics = {}
def sighandler(self, sig, frame):
+ signal.signal(signal.SIGCHLD, self.sighandler)
cpid, status, rusage = os.wait4(self.pid, os.WNOHANG)
if cpid == self.pid:
self.cpid = cpid
self.rusage = RUsage(rusage)
self.status = status
+ self.statistics['ru_elapsed'] = time.time() - self.starttime
+
def run(self):
- # Set signal handler to get select to return on exit
signal.signal(signal.SIGCHLD, self.sighandler)
stdout_r, stdout_w = os.pipe()
@@ -41,6 +45,7 @@
gc_was_enabled = gc.isenabled()
gc.disable()
+ self.starttime = time.time()
try:
self.pid = os.fork()
except:
@@ -65,6 +70,8 @@
if gc_was_enabled:
gc.enable()
+ self.script.do_start(self)
+
fdset = set([stdout_r, stderr_r])
timeout = None
@@ -95,12 +102,19 @@
fdset.remove(stderr_r)
self.do_stderr(data)
+ self._set_statistics()
+ self.script.do_finish(self)
+
+ def _set_statistics(self):
+ """ set statistics from rusage """
+ for stat in ('ru_utime', 'ru_stime', 'ru_maxrss'):
+ self.statistics[stat] = getattr(self.rusage, stat)
def do_stdout(self, data):
- self.script.do_stdout(data)
+ self.script.do_stdout(self, data)
def do_stderr(self, data):
- self.script.do_stderr(data)
+ self.script.do_stderr(self, data)
def failed(self):
if self.status is None:
@@ -114,3 +128,5 @@
class PyPyInterpreter(BaseInterpreter):
executable = "pypy-c"
+
+interpreters = [PythonInterpreter, PyPyInterpreter]
Modified: pypy/build/benchmark/runner.py
==============================================================================
--- pypy/build/benchmark/runner.py (original)
+++ pypy/build/benchmark/runner.py Tue Sep 15 16:40:51 2009
@@ -8,10 +8,20 @@
def __init__(self, path):
self.runargs = [str(path)]
- def do_stdout(self, data):
+ def do_start(self, interp):
+ """ Interpreter has been started """
+ pass
+
+ def do_finish(self, interp):
+ """ Interpreter has exited """
+ pass
+
+ def do_stdout(self, interp, data):
+ """ stdout data received from interpreter """
sys.stdout.write(data)
- def do_stderr(self, data):
+ def do_stderr(self, interp, data):
+ """ stderr data received from interpreter """
sys.stderr.write(data)
class BenchmarkIterator(object):
@@ -27,22 +37,12 @@
continue
yield self.factory(f)
-# XXX move to interpreters
-class InterpreterIterator(list):
- """ an iterable of the interpreters to run """
- def __init__(self):
- # Introspect interpreters
- bi = interpreters.BaseInterpreter
- for name in dir(interpreters):
- i = getattr(interpreters, name)
- if i is not bi and type(i) is type(bi) and issubclass(i, bi):
- self.append(i)
-
class BenchmarkRunner(object):
""" Run the benchmarks using the defined interpreters """
+ interpreters = interpreters.interpreters
+
def __init__(self, benchmarkdir):
self.benchmarks = BenchmarkIterator(benchmarkdir, BaseBenchmark)
- self.interpreters = InterpreterIterator()
def run(self):
for bm in self.benchmarks:
@@ -51,7 +51,7 @@
print interp.executable
i = interp(bm)
i.run()
- print 'Time: ', (i.rusage.ru_stime + i.rusage.ru_utime)
+ print 'Time: %(ru_elapsed).4f %(ru_stime).4f %(ru_utime).4f ' % i.statistics
if __name__ == '__main__':
if len(sys.argv) >= 2:
Modified: pypy/build/benchmark/test/test_interpreters.py
==============================================================================
--- pypy/build/benchmark/test/test_interpreters.py (original)
+++ pypy/build/benchmark/test/test_interpreters.py Tue Sep 15 16:40:51 2009
@@ -15,11 +15,19 @@
self.runargs = args
self.stdout = []
self.stderr = []
+ self.interp = None
+ self.finish = None
- def do_stdout(self, data):
+ def do_start(self, interp):
+ self.interp = interp
+
+ def do_finish(self, interp):
+ self.finish = interp
+
+ def do_stdout(self, interp, data):
self.stdout.append(data)
- def do_stderr(self, data):
+ def do_stderr(self, interp, data):
self.stderr.append(data)
class TestInterpreter(object):
@@ -31,6 +39,13 @@
assert os.WIFEXITED(bi.status)
assert os.WEXITSTATUS(bi.status) == 0
assert not bi.failed()
+ assert s.interp is bi
+ assert s.finish is bi
+ assert bi.statistics['ru_elapsed'] >= 0
+ assert bi.statistics['ru_stime'] >= 0
+ assert bi.statistics['ru_utime'] >= 0
+ assert bi.statistics['ru_elapsed'] >= (bi.statistics['ru_stime'] +
+ bi.statistics['ru_utime'])
def test_fail(self):
s = FakeScript()
@@ -45,7 +60,7 @@
bi = EchoInterpreter(s)
bi.run()
assert s.stdout == ['fake\n', '']
-
+
class TestRUsage(object):
def test_basic(self):
ru = RUsage(range(16))
More information about the Pypy-commit
mailing list