[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