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

hpk at codespeak.net hpk at codespeak.net
Sat Nov 22 14:42:36 CET 2008


Author: hpk
Date: Sat Nov 22 14:42:36 2008
New Revision: 60066

Modified:
   pypy/build/benchmem/report.py
Log:
generate a different simpler table for pauses 



Modified: pypy/build/benchmem/report.py
==============================================================================
--- pypy/build/benchmem/report.py	(original)
+++ pypy/build/benchmem/report.py	Sat Nov 22 14:42:36 2008
@@ -81,10 +81,21 @@
     def __init__(self, resultset):
         self.resultset = resultset.filter(benchtype=self.benchtype) 
 
-class TableReporter(ReporterBase):
+    def getexecutables(self, unique=True, short=True):
+        executables = []
+        for result in self.resultset.results:
+            if short:
+                name = result.executable_short
+            else:
+                name = str(result.executable)
+            if not unique or name not in executables:
+                executables.append(name)
+        return executables
 
-    begin = report = end = lambda x: None  # hooks
+class CheckpointDetails(ReporterBase):
+    benchtype = "objsizes"  
 
+    begin = report = end = lambda x: None  # hooks
     def run_text(self):
         self.begin()
         for name, results in self.resultset.getname2results():
@@ -97,32 +108,13 @@
                 for result in results:
                     row.append(result.snapshots[i].private)
                 rows.append(row)
-            self.report(name, rows)
+            self.tw.sep("=", "private RSS at checkpoints: %s" %(name,))
+            self.tw.line(asciitable(rows))
         self.end()
 
-class CheckpointDetails(TableReporter):
-    benchtype = "objsizes"  
-    def begin(self):
-        self.tw = py.io.TerminalWriter()
-
-    def report(self, name, rows):
-        self.tw.sep("=", "private RSS at checkpoints: %s" %(name,))
-        self.tw.line(asciitable(rows))
-
 class IncrementalSizePerBench(ReporterBase): 
     benchtype = "objsizes"
 
-    def getexecutables(self):
-        ret = None
-        for name, results in self.resultset.getname2results():
-            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 
-
     def run_text(self):
         tw = py.io.TerminalWriter()
         tw.sep("=", "Incremental private RSS of size benchmarks")
@@ -136,16 +128,19 @@
         print "wrote", p
 
     def gettable(self):
-        executables = self.getexecutables()
+        executables = self.getexecutables(unique=True, short=True)
         row0 = ["name"] + [str(x) for x in executables]
         rows = [row0]
         name2results = self.resultset.getname2results()
         name2results.sort() 
 
+        # we rely on result ordering below, i.e. 
+        # each benchmark is run and recorded with the same interpreter ordering 
         for name, results in name2results:
             basesize = self.get_incremental_size(results[0])
             row = [name]
-            for result in results:
+            for executable, result in zip(executables, results):
+                assert result.executable_short == executable, "ordering assumtion" 
                 incsize = self.get_incremental_size(result)
                 # colors work but messup table layout
                 color = incsize <= basesize and "green" or "red"
@@ -389,6 +384,7 @@
         snapshots = BaseSizeOfInterpreters(self.full_resultset).run_graphic()
         name2result = self.resultset.getname2results()
         plotter.plot_appprofiles(name2result, snapshots) 
+        plotter.plot_appprofiles(name2result, totals)
 
     def generate_table(self, rest_table=False):
         executables = self.getexecutables()
@@ -450,53 +446,43 @@
 class Pauses(ReporterBase):
     benchtype = "pauses"
 
-    def getexecutables(self):
-        return [r.executable for r in self.resultset.results]
-
     def run_rest(self, filename="table-pauses.txt"):
         p = py.path.local(filename)
-        rows = self.generate_table(True)
+        rows = self.generate_table()
         p.write(str(ReSTtable(rows)))
         print "wrote", p
 
-
     def run_text(self):
         tw = py.io.TerminalWriter()
         tw.sep("=", "Pauses between every bytecode")
         rows = self.generate_table()
         tw.line(asciitable(rows))
 
-    def generate_table(self, gist_only=False):
-        if gist_only:
-            row0 = ["interpreter", "benchmark", "no. samples", "median", "max"]
-        else:
-            row0 = ["interpreter", "benchmark", "#samples", "median", "max", "#large"]
-
+    def generate_table(self):
+        executables = self.getexecutables()
+        row0 = ["bench"] + executables
         rows = [row0]
+
+        # order by benchname
+        benchname2executable2result = {}
         for result in self.resultset.results:
-            cell0 = [result.executable_short, result.benchname]
-            samples = result.lst
-            # get all samples that are larger than FACTOR * smallest_sample
-            # base_sample = min(samples)
-            # FACTOR = 100
-            # threshold = FACTOR * base_sample
-            # get all samples that are larger than threshold
-            threshold = 0.050
-            median = samples[len(samples) / 2]
-            pauses = [sample for sample in samples if sample > threshold]
-            pauses.sort()
-            pauses.reverse()
-            if gist_only:
-                row = cell0 + [len(samples), "%.5f" % median, "%.2f" % max(samples)]
-            else:
-                row = cell0 + [threshold, len(samples), "%.5f" % median, "%.2f" % max(samples), len(pauses)] + [str(pause) for pause in pauses]
-            rows.append(row)
-        return rows
+            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:
+            row = [benchname]
+            for executable in row0[1:]:
+                result = benchname2executable2result[benchname][executable]
+                maxpause = max(result.lst) 
+                row.append("%.2fs" %(maxpause,))
+            rows.append(row) 
+        return rows 
 
     def run_graphic(self, plotter):
         plotter.plot_pausehistogram(self.resultset)
-        name2result = resultset.getname2results()
-        plotter.plot_appprofiles(name2result, totals)
 
 if __name__ == "__main__":
     options, args = parser.parse_args()
@@ -527,7 +513,7 @@
             if not reporter.resultset:
                 print "skipping %s reporting, no results found" %(cls.__name__, )
                 continue 
-            if options.text and hasattr(reporter, 'run'):
+            if options.text and hasattr(reporter, 'run_text'):
                 reporter.run_text()
             if options.basepath or options.show:
                 if hasattr(reporter, 'run_graphic'):



More information about the Pypy-commit mailing list