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

hpk at codespeak.net hpk at codespeak.net
Thu Sep 25 15:45:46 CEST 2008


Author: hpk
Date: Thu Sep 25 15:45:44 2008
New Revision: 58432

Modified:
   pypy/build/benchmem/report.py
   pypy/build/benchmem/runbench.py
Log:
more specific reporting:
* incremental sizes of size benchmarks 
* detailed base interpreter sizes


Modified: pypy/build/benchmem/report.py
==============================================================================
--- pypy/build/benchmem/report.py	(original)
+++ pypy/build/benchmem/report.py	Thu Sep 25 15:45:44 2008
@@ -12,6 +12,8 @@
 parser = py.compat.optparse.OptionParser(usage=__doc__)
 parser.add_option("-l", "--benchlog", action="store", dest="benchlog", default="bench.log", 
                   help="logfile to read results from")
+parser.add_option("-g", "--gnuplot", action="store_true", dest="gnuplot", default=False,
+                  help="generate gnuplot output")
 
 def asciitable(table):
     colmax = []
@@ -27,6 +29,7 @@
             line.append("%%-%ds" %(width) %(col))
         lines.append(" ".join(line))
     return "\n".join(lines)
+
         
 def maxtable_overview(reader):
     tw = py.io.TerminalWriter()
@@ -103,6 +106,81 @@
          )
         os.system("gnuplot gnuplotcmd")
 
+class Sorter:
+    def __init__(self, name2results):
+        self.name2results = name2results
+
+    def filter(self, benchprefix=""):
+        d = {}
+        for name, results in self.name2results.iteritems():
+            if name.startswith(benchprefix):
+                d[name] = results
+        return Sorter(d)
+
+    def getsorted(self):
+        l = self.name2results.items()
+        l.sort()
+        return l
+
+    def getexecutables(self):
+        ret = None
+        for name, results in self.name2results.iteritems():
+            executables = [result.executable for result in results]
+            if ret is None:
+                ret = executables
+            if ret != executables:
+                raise ValueError("resultset has incompatible list of executables"
+                    "%s != %s" %(ret, executables))
+        return ret 
+            
+class IncrementalSizePerBench:
+    def __init__(self, reader):
+        self.reader = reader
+
+    def run(self):
+        tw = py.io.TerminalWriter()
+        tw.sep("=", "Incremental private RSS of size benchmarks")
+        sorter = Sorter(self.reader.name2results)
+        sorter = sorter.filter(benchprefix="sizes.")
+        executables = sorter.getexecutables()
+        row0 = ["name"] + [str(x) for x in executables]
+        rows = [row0]
+        for name, results in sorter.getsorted():
+            basesize = self.get_incremental_size(results[0])
+            row = [name]
+            for result in results:
+                incsize = self.get_incremental_size(result)
+                # colors work but messup table layout
+                #color = incsize <= basesize and "green" or "red"
+                #row.append(tw.markup(str(incsize), **{color:True}))
+                row.append(incsize)
+            rows.append(row)
+        tw.line(asciitable(rows))
+ 
+    def get_incremental_size(self, result):
+        # checkpoint 0: state before benchmark
+        # checkpoint 1: state at end of benchmark func
+        # checkpoint 2: state after benchmark func finished
+        basesize = result.snapshots[0].private
+        inbench = result.snapshots[1].private
+        return inbench - basesize
+
+class BaseSizeOfInterpreters:
+    def __init__(self, reader):
+        self.reader = reader
+    def run(self):
+        tw = py.io.TerminalWriter()
+        tw.sep("=", "Base Size of interpreters (using sizes.bench_list_of_None)")
+        sorter = Sorter(self.reader.name2results).filter(benchprefix="sizes.")
+        row0 = "executable rss shared_clean shared_dirty private_clean private_dirty".split()
+        rows = [row0]
+        for result in sorter.name2results['sizes.bench_list_of_None']:
+            row = [result.executable]
+            for name in row0[1:]:
+                row.append(getattr(result.snapshots[0], name))
+            rows.append(row)
+        tw.line(asciitable(rows))
+
 if __name__ == "__main__":
     options, args = parser.parse_args()
 
@@ -112,7 +190,11 @@
 
     #maxtable_overview(reader)
     CheckpointDetails(reader).run()
-    Gnuplot(reader).run()
+    IncrementalSizePerBench(reader).run()
+    BaseSizeOfInterpreters(reader).run()
+    
+    if options.gnuplot: 
+        Gnuplot(reader).run()
 
     #for name, results in reader.name2results.items():
     #    tw.sep("=", name)
@@ -122,3 +204,4 @@
     #            result.max("shared_dirty"), 
     #            result.max("private_dirty")
     ###        )
+

Modified: pypy/build/benchmem/runbench.py
==============================================================================
--- pypy/build/benchmem/runbench.py	(original)
+++ pypy/build/benchmem/runbench.py	Thu Sep 25 15:45:44 2008
@@ -145,7 +145,8 @@
             # see write_benchheader
             executable = eval(line.split("=", 1)[1])
             benchbasename = eval(f.readline().split("=", 1)[1])
-            benchname = eval(f.readline().split("=", 1)[1])
+            benchfuncname = eval(f.readline().split("=", 1)[1])
+            benchname = "%s.%s" % (benchbasename[:-3], benchfuncname)
             benchargs = eval(f.readline().split("=", 1)[1])
 
             snapshots = []



More information about the Pypy-commit mailing list