[pypy-svn] r60087 - pypy/build/benchmem

hpk at codespeak.net hpk at codespeak.net
Sun Nov 23 05:36:03 CET 2008


Author: hpk
Date: Sun Nov 23 05:36:00 2008
New Revision: 60087

Modified:
   pypy/build/benchmem/report.py
Log:
generate ReST tables with title, using table-directive 


Modified: pypy/build/benchmem/report.py
==============================================================================
--- pypy/build/benchmem/report.py	(original)
+++ pypy/build/benchmem/report.py	Sun Nov 23 05:36:00 2008
@@ -42,7 +42,7 @@
         lines.append(" ".join(line))
     return "\n".join(lines)
 
-def ReSTtable(table):
+def ReSTtable(title, table):
     colmax = getmax(table)
     lines = []
     l = ["-" * width for width in colmax]
@@ -60,7 +60,9 @@
             lines.append(sepline)
         else:
             lines.append(sepline)
-    return "\n".join(lines)
+    linesep = "\n   "
+    start = ".. table:: %s\n" %(title,) 
+    return start + linesep + linesep.join(lines)
 
 def maxtable_overview(resultset):
     tw = py.io.TerminalWriter()
@@ -81,7 +83,7 @@
     def __init__(self, resultset):
         self.resultset = resultset.filter(benchtype=self.benchtype) 
 
-    def getexecutables(self, unique=True, short=True):
+    def getexecutables(self, unique=True, short=True, pythonfirst=True):
         executables = []
         for result in self.resultset.results:
             if short:
@@ -89,7 +91,11 @@
             else:
                 name = str(result.executable)
             if not unique or name not in executables:
-                executables.append(name)
+                if pythonfirst and name.startswith("python"):
+                    executables.insert(0, name)
+                    pythonfirst = False
+                else:
+                    executables.append(name)
         return executables
 
 class CheckpointDetails(ReporterBase):
@@ -124,7 +130,7 @@
     def run_rest(self, filename="table-objsize.txt"):
         rows = self.gettable()
         p = py.path.local(filename)
-        p.write(str(ReSTtable(rows)))
+        p.write(ReSTtable("Memory usage of single Python objects",rows))
         print "wrote", p
 
     def gettable(self):
@@ -305,16 +311,13 @@
                         row.append("**%0.2f**/%.02f" % 
                             (timing['real'], timing['user'])) #, timing['sys']))
             rows.append(row)
-        p.write(str(ReSTtable(rows)))
+        p.write(ReSTtable("Interpreter startup time", rows))
         print "wrote", p
 
 
 class BenchTimeOfInterpreters(ReporterBase):
     benchtype = "benchtime" 
 
-    def getexecutables(self):
-        return [r.executable for r in self.resultset.results]
-
     def run_text(self):
         tw = py.io.TerminalWriter()
         tw.sep("=", "Timed benchmarks")
@@ -324,32 +327,39 @@
     def run_rest(self, filename="table-benchtime.txt"):
         p = py.path.local(filename)
         rows = self.generate_table()
-        p.write(str(ReSTtable(rows)))
+        p.write(ReSTtable("Popular speed benchmarks", rows))
         print "wrote", p
 
     def generate_table(self):
-        executables = self.getexecutables()
-        row0 = "Interpreter Benchmark Performance usertime Ratio".split()
-        rows = [row0]
+        
         # result.mintimings -> [(name, timings_dict)]
-        names = [x[0] for x in self.resultset.results[0].mintimings]
-        reference = {}
-        for selectname in names:
-            for result in self.resultset.results:
-                for name, timing in result.mintimings:
-                    if name == selectname and "python" in result.executable:
-                        reference[name] = timing['perf']
-        for selectname in names:
-            for result in self.resultset.results:
-                for name, timing in result.mintimings:
-                    if name == selectname:
-                        rows.append([result.executable_short, name,
-                            "%.2f" % (timing['perf'], ), timing['user'],
-                            "%.2f" % (timing['perf'] / reference[name], )])
-            rows.append([])
-        return rows
+        # order by name 
+        benchname2executable2mintimings = {}
+        for result in self.resultset.results:
+            for name,mintimings in result.mintimings:
+                d = benchname2executable2mintimings.setdefault(name, {})
+                assert result.executable_short not in d
+                d[result.executable_short] = mintimings 
+        benchnames = benchname2executable2mintimings.keys()
+        benchnames.sort()
 
+        executables = self.getexecutables(pythonfirst=True)
 
+        row0 = ["name"] + executables
+        rows = [row0]
+
+        for name in benchnames:
+            row = [name]
+            reference = None
+            for executable in row0[1:]:
+                timing = benchname2executable2mintimings[name][executable]  
+                perf = timing['perf']
+                if reference is None:
+                    reference = perf 
+                cell = "**%.2f** / %d" % (perf / reference, perf) 
+                row.append(cell)
+            rows.append(row)
+        return rows
 
 class Appprofiles(ReporterBase):
     benchtype = "appprofiles"
@@ -375,7 +385,7 @@
     def run_rest(self, filename="table-appprofiles.txt"):
         p = py.path.local(filename)
         rows = self.generate_table(True)
-        p.write(str(ReSTtable(rows)))
+        p.write(ReSTtable("Application Benchmarks", rows))
         print "wrote", p
 
 
@@ -449,7 +459,7 @@
     def run_rest(self, filename="table-pauses.txt"):
         p = py.path.local(filename)
         rows = self.generate_table()
-        p.write(str(ReSTtable(rows)))
+        p.write(ReSTtable("bytecode execution pauses", rows))
         print "wrote", p
 
     def run_text(self):
@@ -469,7 +479,6 @@
             d = benchname2executable2result.setdefault(result.benchname, {})
             assert result.executable_short not in d
             d[result.executable_short] = result
-           
         benchnames = benchname2executable2result.keys()
         benchnames.sort()
         for benchname in benchnames:



More information about the Pypy-commit mailing list