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

xoraxax at codespeak.net xoraxax at codespeak.net
Sat Nov 15 22:47:57 CET 2008


Author: xoraxax
Date: Sat Nov 15 22:47:56 2008
New Revision: 59934

Modified:
   pypy/build/benchmem/report.py
   pypy/build/benchmem/runbench.py
Log:
Enhanced the textual appprofiles report, changed pauses threshold to a fixed one.

Modified: pypy/build/benchmem/report.py
==============================================================================
--- pypy/build/benchmem/report.py	(original)
+++ pypy/build/benchmem/report.py	Sat Nov 15 22:47:56 2008
@@ -351,7 +351,12 @@
         self.resultset = resultset.filter(benchtype="appprofiles")
 
     def getexecutables(self):
-        return [r.executable for r in self.resultset.results]
+        l = []
+        for r in self.resultset.results:
+            executable = r.executable
+            if executable not in l:
+                l.append(executable)
+        return l
 
     def run(self):
         if not self.resultset:
@@ -360,18 +365,53 @@
         tw.sep("=", "Appprofiles memory sampling")
         # result.mintimings -> [(name, timings_dict)]
         executables = self.getexecutables()
-        row0 = "run duration #snapshots min avg max".split()
+        row0 = "run duration #snapshots heapdata_min heapdata_avg heapdata_max dirtyd_min dirtyd_avg dirtyd_max min_data avg_data max_data code_min code_avg code_max".split()
         rows = [row0]
-        names = [result.benchname for result in self.resultset.results]
+        names = []
+        for result in self.resultset.results:
+            if result.benchname not in names:
+                names.append(result.benchname)
+        stats = {}
+        attrs = ("min", "avg", "max",
+                 "min_dirtied_data", "avg_dirtied_data", "max_dirtied_data",
+                 "min_data", "avg_data", "max_data",
+                 "min_code", "avg_code", "max_code",
+                 )
         for name in names:
             for result in self.resultset.results:
                 if name == result.benchname:
                     timestamps = [float(ss.timestamp) for ss in result.snapshots]
                     min_ts, max_ts = min(timestamps), max(timestamps)
+                    row = ["%s-%s" %(result.executable, name),
+                           "%.2f" % (max_ts - min_ts, ), len(result.snapshots)]
+
+                    for attr in attrs:
+                        for kind, default in ((min, 2**31), (max, 0)):
+                            key = (result.executable, kind.__name__)
+                            valuedict = stats.setdefault(key, {})
+                            old = valuedict.get(attr, default)
+                            data = getattr(result, attr)
+                            valuedict[attr] = kind(old, data)
+                            data_str = str(data)
+                            if "avg" in attr:
+                                data_str = "%.2f" % data
+
+                        row.append(data_str)
+
+                    rows.append(row)
+        for executable in executables:
+            for kind in (min, max):
+                kindname = kind.__name__
+                key = (executable, kind.__name__)
+                row = ["%s-%s" % (executable, kindname), "-", "-"]
+                for attr in attrs:
+                    data = stats[key][attr]
+                    data_str = str(data)
+                    if "avg" in attr:
+                        data_str = "%.2f" % data
+                    row.append(data_str)
+                rows.append(row)
 
-                    rows.append(["%s-%s" %(result.executable, name),
-                       "%.2f" % (max_ts - min_ts, ), len(result.snapshots),
-                       result.min, "%.2f" % result.avg, result.max])
         tw.line(asciitable(rows))
 
 
@@ -393,10 +433,12 @@
         for result in self.resultset.results:
             cell0 = "%s-%s" % (result.executable_short, result.benchname)
             samples = result.lst
-            base_sample = min(samples)
             # get all samples that are larger than FACTOR * smallest_sample
-            FACTOR = 1000
-            threshold = FACTOR * base_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()

Modified: pypy/build/benchmem/runbench.py
==============================================================================
--- pypy/build/benchmem/runbench.py	(original)
+++ pypy/build/benchmem/runbench.py	Sat Nov 15 22:47:56 2008
@@ -498,10 +498,29 @@
 
     def __init__(self, snapshots, *args, **kwargs):
         CommonResult.__init__(self, snapshots, *args, **kwargs)
-        self.min = min(ss.heap_and_data(self) for ss in snapshots)
-        self.max = max(ss.heap_and_data(self) for ss in snapshots)
+        avg = lambda x: sum(x) / float(len(snapshots))
+
+        heap_values = [ss.heap_and_data(self) for ss in snapshots]
+        self.min = min(heap_values)
+        self.max = max(heap_values)
         # XXX this way we are not integrating over time so we have skew again
-        self.avg = sum(ss.heap_and_data(self) for ss in snapshots) / float(len(snapshots))
+        self.avg = avg(heap_values)
+
+        code_values = [ss.filter(group=self.executable, kind=Mappings.CODE).rss
+                for ss in snapshots]
+        dirty_data_values = [ss.filter(group=self.executable, kind=Mappings.DATA).dirty
+                for ss in snapshots]
+        data_values = [ss.filter(group=self.executable, kind=Mappings.DATA).rss
+                for ss in snapshots]
+        self.max_code = max(code_values)
+        self.min_code = min(code_values)
+        self.avg_code = avg(code_values)
+        self.max_dirtied_data = max(dirty_data_values)
+        self.min_dirtied_data = min(dirty_data_values)
+        self.avg_dirtied_data = avg(dirty_data_values)
+        self.min_data = min(data_values)
+        self.avg_data = avg(data_values)
+        self.max_data = max(data_values)
 
 
 class BasesizeResult(Result):
@@ -577,6 +596,8 @@
             setattr(self, name, sum([getattr(x, name) for x in mappings]))
         self.private = self.private_dirty + self.private_clean
         self.shared = self.shared_dirty + self.shared_clean
+        self.dirty = self.private_dirty + self.shared_dirty
+        self.clean = self.private_clean + self.shared_clean
 
     def filter(self, group=None, kind=None, inv=False):
         new_mappings = []



More information about the Pypy-commit mailing list