[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