[Python-checkins] r46122 - sandbox/trunk/rjsh-pybench/pybench.py

richard.jones python-checkins at python.org
Tue May 23 19:15:38 CEST 2006


Author: richard.jones
Date: Tue May 23 19:15:38 2006
New Revision: 46122

Modified:
   sandbox/trunk/rjsh-pybench/pybench.py
Log:
Various changes:
- report and compare the min run time
- enable sys.setcheckinterval(sys.maxint)
- enable "verbose" mode (default off) to reduce console output
- allow selection of specific benchmarks to run


Modified: sandbox/trunk/rjsh-pybench/pybench.py
==============================================================================
--- sandbox/trunk/rjsh-pybench/pybench.py	(original)
+++ sandbox/trunk/rjsh-pybench/pybench.py	Tue May 23 19:15:38 2006
@@ -182,6 +182,7 @@
         runs = len(self.times)
         if runs == 0:
             return 0,0
+        mintime = min(self.times)
         totaltime = reduce(operator.add,self.times,0.0)
         avg = totaltime / float(runs)
         op_avg = totaltime / float(runs * self.rounds * self.operations)
@@ -191,7 +192,7 @@
         else:
             # use self.last_timing - not too accurate
             ov_avg = self.last_timing[2]
-        return avg,op_avg,ov_avg
+        return mintime,avg,op_avg,ov_avg
 
 ### Load Setup
 
@@ -217,22 +218,32 @@
         self.tests = {}
         self.version = 0.31
 
-    def load_tests(self,setupmod,warp=1):
+    def load_tests(self,setupmod,warp=1, limitnames=""):
 
         self.warp = warp
+        if limitnames:
+            limitnames = re.compile(limitnames, re.I)
+        else:
+            limitnames = None
         tests = self.tests
         print 'Searching for tests...'
         setupmod.__dict__.values()
         for c in setupmod.__dict__.values():
-            if hasattr(c,'is_a_test') and c.__name__ != 'Test':
-                tests[c.__name__] = c(warp)
+            if not hasattr(c,'is_a_test'):
+                continue
+            name = c.__name__
+            if  name == 'Test':
+                continue
+            if limitnames is not None and limitnames.search(name) is None:
+                continue
+            tests[name] = c(warp)
         l = tests.keys()
         l.sort()
         for t in l:
             print '  ',t
         print
 
-    def run(self):
+    def run(self, verbose):
 
         tests = self.tests.items()
         tests.sort()
@@ -242,73 +253,84 @@
         self.starttime = time.time()
         roundtime = clock()
         for i in range(self.rounds):
-            print ' Round %-25i  real   abs    overhead' % (i+1)
+            if verbose:
+                print ' Round %-25i  real   abs    overhead' % (i+1)
             for j in range(len(tests)):
                 name,t = tests[j]
-                print '%30s:' % name,
+                if verbose:
+                    print '%30s:' % name,
                 t.run()
-                print '  %.3fr %.3fa %.3fo' % t.last_timing
-            print '                                 ----------------------'
-            print '            Average round time:      %.3f seconds' % \
-                  ((clock() - roundtime)/(i+1))
-            print
+                if verbose:
+                    print '  %.3fr %.3fa %.3fo' % t.last_timing
+            if verbose:
+                print '                                 ----------------------'
+                print '            Average round time:      %.3f seconds' % \
+                    ((clock() - roundtime)/(i+1))
+                print
+            else:
+                print '%d ... done'%i
         self.roundtime = (clock() - roundtime) / self.rounds
         print
 
     def print_stat(self, compare_to=None, hidenoise=0):
 
         if not compare_to:
-            print '%-30s      per run    per oper.   overhead' % 'Tests:'
-            print '-'*72
+            print '%-30s       min run    avg run    per oprn  overhead' % 'Tests:'
+            print '-'*77
             tests = self.tests.items()
             tests.sort()
+            totalmintime = 0
             for name,t in tests:
-                avg,op_avg,ov_avg = t.stat()
-                print '%30s: %10.2f ms %7.2f us %7.2f ms' % \
-                      (name,avg*1000.0,op_avg*1000000.0,ov_avg*1000.0)
-            print '-'*72
-            print '%30s: %10.2f ms' % \
-                  ('Average round time',self.roundtime * 1000.0)
+                mintime,avg,op_avg,ov_avg = t.stat()
+                totalmintime += mintime
+                print '%30s: %9.2f ms %9.2f ms %6.2f us  %6.2f' % \
+                      (name,mintime*1000.0,avg*1000.0,op_avg*1000000.0,ov_avg*1000.0)
+            print '-'*77
+            print '%30s: %9.2f ms' % \
+                  ('Notional minimum round time', totalmintime * 1000.0)
 
         else:
-            print '%-30s      per run    per oper.    diff *)' % \
+            print 'Comparing with: %s (rounds=%i, warp=%i)' % \
+                  (compare_to.name,compare_to.rounds,compare_to.warp)
+            print '%-30s      min run     cmp run     avg run      diff' % \
                   'Tests:'
-            print '-'*72
+            print '-'*77
             tests = self.tests.items()
             tests.sort()
             compatible = 1
+            totalmintime = other_totalmintime = 0
             for name,t in tests:
-                avg,op_avg,ov_avg = t.stat()
+                mintime,avg,op_avg,ov_avg = t.stat()
+                totalmintime += mintime
                 try:
                     other = compare_to.tests[name]
                 except KeyError:
                     other = None
                 if other and other.version == t.version and \
                    other.operations == t.operations:
-                    avg1,op_avg1,ov_avg1 = other.stat()
-                    qop_avg = (op_avg/op_avg1-1.0)*100.0
+                    mintime1,avg1,op_avg1,ov_avg1 = other.stat()
+                    other_totalmintime += mintime1
+                    diff = (mintime/mintime1 - 1.0)*100.0
                     if hidenoise and abs(qop_avg) < 10:
-                        qop_avg = ''
+                        diff = ''
                     else:
-                        qop_avg = '%+7.2f%%' % qop_avg
+                        diff = '%+7.2f%%' % diff
                 else:
-                    qavg,qop_avg = 'n/a', 'n/a'
+                    qavg,diff = 'n/a', 'n/a'
                     compatible = 0
-                print '%30s: %10.2f ms %7.2f us  %8s' % \
-                      (name,avg*1000.0,op_avg*1000000.0,qop_avg)
-            print '-'*72
+                print '%30s: %8.2f ms %8.2f ms %8.2f ms  %8s' % \
+                      (name,mintime*1000.0,mintime1*1000.0, avg*1000.0,diff)
+            print '-'*77
             if compatible and compare_to.roundtime > 0 and \
                compare_to.version == self.version:
-                print '%30s: %10.2f ms             %+7.2f%%' % \
-                      ('Average round time',self.roundtime * 1000.0,
-                       ((self.roundtime*self.warp)/
-                        (compare_to.roundtime*compare_to.warp)-1.0)*100.0)
+                print '%30s: %8.2f ms %8.2f ms                %+7.2f%%' % \
+                      ('Notional minimum round time', totalmintime * 1000.0,
+                      other_totalmintime * 1000.0,
+                       ((totalmintime*self.warp)/
+                        (other_totalmintime*compare_to.warp)-1.0)*100.0)
             else:
-                print '%30s: %10.2f ms                  n/a' % \
-                      ('Average round time',self.roundtime * 1000.0)
-            print
-            print '*) measured against: %s (rounds=%i, warp=%i)' % \
-                  (compare_to.name,compare_to.rounds,compare_to.warp)
+                print '%30s: %9.2f ms                    n/a' % \
+                      ('Notional minimum round time', totalmintime * 1000.0)
         print
 
 def print_machine():
@@ -339,7 +361,11 @@
                SwitchOption('-S','show statistics of benchmarks',0),
                ArgumentOption('-w','set warp factor to arg',Setup.Warp_factor),
                SwitchOption('-d','hide noise in compares', 0),
+               SwitchOption('-v','verbose output (not recommended)', 0),
                SwitchOption('--no-gc','disable garbage collection', 0),
+               SwitchOption('--no-syscheck',
+                    '"disable" sys check interval (set to sys.maxint)', 0),
+               ArgumentOption('-t', 'tests containing substring', '')
                ]
 
     about = """\
@@ -380,6 +406,11 @@
         hidenoise = self.values['-d']
         warp = self.values['-w']
         nogc = self.values['--no-gc']
+        limitnames = self.values['-t']
+        verbose = self.values['-v']
+        nosyscheck = self.values['--no-syscheck']
+
+        print 'PYBENCH',__version__
 
         # Switch off GC
         if nogc:
@@ -390,8 +421,13 @@
             else:
                 if self.values['--no-gc']:
                     gc.disable()
+                    print 'NO GC'
+
+        # maximise sys check interval
+        if nosyscheck:
+            sys.setcheckinterval(sys.maxint)
+            print 'CHECKINTERVAL =', sys.maxint
 
-        print 'PYBENCH',__version__
         print
 
         if not compare_to:
@@ -436,9 +472,9 @@
         # Create benchmark object
         bench = Benchmark()
         bench.rounds = rounds
-        bench.load_tests(Setup,warp)
+        bench.load_tests(Setup,warp,limitnames)
         try:
-            bench.run()
+            bench.run(verbose)
         except KeyboardInterrupt:
             print
             print '*** KeyboardInterrupt -- Aborting'


More information about the Python-checkins mailing list