[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