]> granicus.if.org Git - python/commitdiff
Add -t option to allow easy test selection.
authorSteve Holden <steve@holdenweb.com>
Fri, 26 May 2006 16:27:59 +0000 (16:27 +0000)
committerSteve Holden <steve@holdenweb.com>
Fri, 26 May 2006 16:27:59 +0000 (16:27 +0000)
Action verbose option correctly.
Tweak operation counts. Add empty and new instances tests.
Enable comparisons across different warp factors. Change version.

17 files changed:
Tools/pybench/Arithmetic.py
Tools/pybench/Calls.py
Tools/pybench/Constructs.py
Tools/pybench/Dict.py
Tools/pybench/Empty.py [new file with mode: 0755]
Tools/pybench/Exceptions.py
Tools/pybench/Imports.py
Tools/pybench/Instances.py
Tools/pybench/Lists.py
Tools/pybench/Lookups.py
Tools/pybench/NewInstances.py [new file with mode: 0755]
Tools/pybench/Numbers.py
Tools/pybench/Setup.py
Tools/pybench/Strings.py
Tools/pybench/Tuples.py
Tools/pybench/Unicode.py
Tools/pybench/pybench.py

index 4ed6219407190bf91a251e1aca706accd7af0017..229396cfde14ded0c686bdc3aa23c81fad2b9f09 100644 (file)
@@ -4,7 +4,7 @@ class SimpleIntegerArithmetic(Test):
 
     version = 0.3
     operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
-    rounds = 120000
+    rounds = 1200*21
 
     def test(self):
 
@@ -159,7 +159,7 @@ class SimpleFloatArithmetic(Test):
 
     version = 0.3
     operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
-    rounds = 100000
+    rounds = 1000*30
 
     def test(self):
 
@@ -314,7 +314,7 @@ class SimpleIntFloatArithmetic(Test):
 
     version = 0.3
     operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
-    rounds = 120000
+    rounds = 1200*30
 
     def test(self):
 
@@ -470,7 +470,7 @@ class SimpleLongArithmetic(Test):
 
     version = 0.3
     operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
-    rounds = 30000
+    rounds = 300*32
 
     def test(self):
 
@@ -625,7 +625,7 @@ class SimpleComplexArithmetic(Test):
 
     version = 0.3
     operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
-    rounds = 40000
+    rounds = 400*27
 
     def test(self):
 
index e2952438d5aba242cc0b1105b436dba62ec43bcc..a94887b4d269962dc4bcaeb2e0e4b791071cf190 100644 (file)
@@ -4,7 +4,7 @@ class PythonFunctionCalls(Test):
 
     version = 0.3
     operations = 5*(1+4+4+2)
-    rounds = 60000
+    rounds = 600*22
 
     def test(self):
 
@@ -113,7 +113,7 @@ class BuiltinFunctionCalls(Test):
 
     version = 0.4
     operations = 5*(2+5+5+5)
-    rounds = 30000
+    rounds = 300*24
 
     def test(self):
 
@@ -234,7 +234,7 @@ class PythonMethodCalls(Test):
 
     version = 0.3
     operations = 5*(6 + 5 + 4)
-    rounds = 20000
+    rounds = 200*27
 
     def test(self):
 
@@ -376,7 +376,7 @@ class Recursion(Test):
 
     version = 0.3
     operations = 5
-    rounds = 50000
+    rounds = 500*21
 
     def test(self):
 
index 00045bd73e3f20bd7c9cc41dbeb24814e1314002..f7ebe73d843f08282f5a46aa05cee30c1f69979a 100644 (file)
@@ -4,7 +4,7 @@ class IfThenElse(Test):
 
     version = 0.31
     operations = 30*3 # hard to say...
-    rounds = 150000
+    rounds = 1500*27
 
     def test(self):
 
@@ -471,7 +471,7 @@ class NestedForLoops(Test):
 
     version = 0.3
     operations = 1000*10*5
-    rounds = 150
+    rounds = 100
 
     def test(self):
 
@@ -496,7 +496,7 @@ class ForLoops(Test):
 
     version = 0.1
     operations = 5 * 5
-    rounds = 8000
+    rounds = 80*25
 
     def test(self):
 
index 54aeae7168356c69cca1cc79d50ef256de526183..d1b38339bdfeee242dd378fea077fb8b6ce3fe92 100644 (file)
@@ -4,7 +4,7 @@ class DictCreation(Test):
 
     version = 0.3
     operations = 5*(5 + 5)
-    rounds = 60000
+    rounds = 600*24
 
     def test(self):
 
@@ -79,7 +79,7 @@ class DictWithStringKeys(Test):
 
     version = 0.1
     operations = 5*(6 + 6)
-    rounds = 200000
+    rounds = 2000*30
 
     def test(self):
 
@@ -168,7 +168,7 @@ class DictWithFloatKeys(Test):
 
     version = 0.1
     operations = 5*(6 + 6)
-    rounds = 200000
+    rounds = 20000
 
     def test(self):
 
@@ -257,7 +257,7 @@ class DictWithIntegerKeys(Test):
 
     version = 0.1
     operations = 5*(6 + 6)
-    rounds = 200000
+    rounds = 2000*19
 
     def test(self):
 
@@ -346,7 +346,7 @@ class SimpleDictManipulation(Test):
 
     version = 0.3
     operations = 5*(6 + 6 + 6 + 6)
-    rounds = 50000
+    rounds = 500*44
 
     def test(self):
 
diff --git a/Tools/pybench/Empty.py b/Tools/pybench/Empty.py
new file mode 100755 (executable)
index 0000000..3c54851
--- /dev/null
@@ -0,0 +1,23 @@
+from pybench import Test\r
+\r
+class EmptyTest(Test):\r
+    """This is just here as a potential measure of repeatability."""\r
+\r
+    version = 0.3\r
+    operations = 1\r
+    rounds = 60000\r
+\r
+    def test(self):\r
+\r
+        l = []\r
+        for i in xrange(self.rounds):\r
+            pass\r
+\r
+\r
+    def calibrate(self):\r
+\r
+        l = []\r
+\r
+        for i in xrange(self.rounds):\r
+            pass\r
+\r
index 7e55708dfef1fc685ba802c90636296cd5425cb2..d6c89419118e6790a1ee81931a7ecc947dbbaf6e 100644 (file)
@@ -4,7 +4,7 @@ class TryRaiseExcept(Test):
 
     version = 0.1
     operations = 2 + 3
-    rounds = 60000
+    rounds = 600*25
 
     def test(self):
 
@@ -44,7 +44,7 @@ class TryExcept(Test):
 
     version = 0.1
     operations = 15 * 10
-    rounds = 200000
+    rounds = 2000*16
 
     def test(self):
 
index 85eb604af539b0bd8d910e0e5f06c4ebe98637a0..b953919c50c2ab8668790f952ba41671c9b01781 100644 (file)
@@ -8,7 +8,7 @@ class SecondImport(Test):
 
     version = 0.1
     operations = 5 * 5
-    rounds = 20000
+    rounds = 2000*15
 
     def test(self):
 
@@ -53,7 +53,7 @@ class SecondPackageImport(Test):
 
     version = 0.1
     operations = 5 * 5
-    rounds = 20000
+    rounds = 200*20
 
     def test(self):
 
@@ -97,7 +97,7 @@ class SecondSubmoduleImport(Test):
 
     version = 0.1
     operations = 5 * 5
-    rounds = 20000
+    rounds = 200*17
 
     def test(self):
 
index 9b1929d16af9ae68db73706249fcb1688acc2e6b..199b129bb77af2eeb62722f69829efd6d352efea 100644 (file)
@@ -4,7 +4,7 @@ class CreateInstances(Test):
 
     version = 0.2
     operations = 3 + 7 + 4
-    rounds = 60000
+    rounds = 600*17
 
     def test(self):
 
index 4c18e99a373ef1a8bf13b2302e62752cf265b113..844612f1e9fcb5759f305b968955aea80376b345 100644 (file)
@@ -4,7 +4,7 @@ class SimpleListManipulation(Test):
 
     version = 0.3
     operations = 5* (6 + 6 + 6)
-    rounds = 60000
+    rounds = 600*45
 
     def test(self):
 
@@ -132,7 +132,7 @@ class ListSlicing(Test):
 
     version = 0.4
     operations = 25*(3+1+2+1)
-    rounds = 400
+    rounds = 4*45
 
     def test(self):
 
@@ -169,7 +169,7 @@ class SmallLists(Test):
 
     version = 0.3
     operations = 5*(1+ 6 + 6 + 3 + 1)
-    rounds = 60000
+    rounds = 600*15
 
     def test(self):
 
index e5529cd47864b0e3d221e6b44b58308ef5656b2c..47ad94ae5454fc1e07925adfa2a0cd9d701344e4 100644 (file)
@@ -4,7 +4,7 @@ class SpecialClassAttribute(Test):
 
     version = 0.3
     operations = 5*(12 + 12)
-    rounds = 100000
+    rounds = 1000*16
 
     def test(self):
 
@@ -185,7 +185,7 @@ class NormalClassAttribute(Test):
 
     version = 0.3
     operations = 5*(12 + 12)
-    rounds = 100000
+    rounds = 1000*20
 
     def test(self):
 
@@ -371,7 +371,7 @@ class SpecialInstanceAttribute(Test):
 
     version = 0.3
     operations = 5*(12 + 12)
-    rounds = 100000
+    rounds = 1000*14
 
     def test(self):
 
@@ -559,7 +559,7 @@ class NormalInstanceAttribute(Test):
 
     version = 0.3
     operations = 5*(12 + 12)
-    rounds = 100000
+    rounds = 1000*22
 
     def test(self):
 
@@ -747,7 +747,7 @@ class BuiltinMethodLookup(Test):
 
     version = 0.3
     operations = 5*(3*5 + 3*5)
-    rounds = 70000
+    rounds = 700*15
 
     def test(self):
 
diff --git a/Tools/pybench/NewInstances.py b/Tools/pybench/NewInstances.py
new file mode 100755 (executable)
index 0000000..a352638
--- /dev/null
@@ -0,0 +1,66 @@
+from pybench import Test
+
+class CreateNewInstances(Test):
+
+    version = 0.1
+    operations = 3 + 7 + 4
+    rounds = 60000
+
+    def test(self):
+
+        class c(object):
+            pass
+
+        class d(object):
+            def __init__(self,a,b,c):
+                self.a = a
+                self.b = b
+                self.c = c
+
+        class e(object):
+            def __init__(self,a,b,c=4):
+                self.a = a
+                self.b = b
+                self.c = c
+                self.d = a
+                self.e = b
+                self.f = c
+
+        for i in xrange(self.rounds):
+            o = c()
+            o1 = c()
+            o2 = c()
+            p = d(i,i,3)
+            p1 = d(i,i,3)
+            p2 = d(i,3,3)
+            p3 = d(3,i,3)
+            p4 = d(i,i,i)
+            p5 = d(3,i,3)
+            p6 = d(i,i,i)
+            q = e(i,i,3)
+            q1 = e(i,i,3)
+            q2 = e(i,i,3)
+            q3 = e(i,i)
+
+    def calibrate(self):
+
+        class c(object):
+            pass
+
+        class d(object):
+            def __init__(self,a,b,c):
+                self.a = a
+                self.b = b
+                self.c = c
+
+        class e(object):
+            def __init__(self,a,b,c=4):
+                self.a = a
+                self.b = b
+                self.c = c
+                self.d = a
+                self.e = b
+                self.f = c
+
+        for i in xrange(self.rounds):
+            pass
index a6aea3317aff5b938e1eefb4b80d270986777a02..e89d00f05a523590e707fdb7400d378f2049259d 100644 (file)
@@ -4,7 +4,7 @@ class CompareIntegers(Test):
 
     version = 0.1
     operations = 30 * 5
-    rounds = 120000
+    rounds = 1200*21
 
     def test(self):
 
@@ -200,7 +200,7 @@ class CompareFloats(Test):
 
     version = 0.1
     operations = 30 * 5
-    rounds = 60000
+    rounds = 600*27
 
     def test(self):
 
@@ -396,7 +396,7 @@ class CompareFloatsIntegers(Test):
 
     version = 0.1
     operations = 30 * 5
-    rounds = 60000
+    rounds = 600*16
 
     def test(self):
 
@@ -592,7 +592,7 @@ class CompareLongs(Test):
 
     version = 0.1
     operations = 30 * 5
-    rounds = 60000
+    rounds = 600*24
 
     def test(self):
 
index 906a2a94f2591ff09a1401b21fa35ff2a3a6f736..1f2f45474fe76bb72546ad5acba6cb21b7c34f9b 100644 (file)
@@ -17,11 +17,16 @@ Number_of_rounds = 10
 Warp_factor = 20
 
 # Import tests
+#from Empty import *
 from Arithmetic import *
 from Calls import *
 from Constructs import *
 from Lookups import *
 from Instances import *
+try:
+    from NewInstances import *
+except:
+    print "Cannot test new-style objects"
 from Lists import *
 from Tuples import *
 from Dict import *
index b01843afaa5151457eb5d333fea7e9db7ac58ee5..43309dabab6ce9425e1e585d8e6d94d5dc3d75b8 100644 (file)
@@ -5,7 +5,7 @@ class ConcatStrings(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 60000
+    rounds = 6000
 
     def test(self):
 
@@ -87,7 +87,7 @@ class CompareStrings(Test):
 
     version = 0.2
     operations = 10 * 5
-    rounds = 200000
+    rounds = 2000*22
 
     def test(self):
 
@@ -169,7 +169,7 @@ class CompareInternedStrings(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 200000
+    rounds = 2000*28
 
     def test(self):
 
@@ -251,7 +251,7 @@ class CreateStringsWithConcat(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 80000
+    rounds = 800*32
 
     def test(self):
 
@@ -326,7 +326,7 @@ class StringSlicing(Test):
 
     version = 0.1
     operations = 5 * 7
-    rounds = 100000
+    rounds = 1000*15
 
     def test(self):
 
@@ -389,7 +389,7 @@ if hasattr('', 'lower'):
 
         version = 0.1
         operations = 3 * (5 + 4 + 2 + 1)
-        rounds = 70000
+        rounds = 14000
 
         def test(self):
 
@@ -462,7 +462,7 @@ if hasattr('', 'lower'):
 
         version = 0.1
         operations = 10 * 7
-        rounds = 80000
+        rounds = 800*24
 
         def test(self):
 
index e84ea53d1dcfa7e4e025ad9baab144c6e5fc6a3f..842fa3e2a92aedbf82e647be3fdccb96e02049cc 100644 (file)
@@ -4,7 +4,7 @@ class TupleSlicing(Test):
 
     version = 0.31
     operations = 3 * 25 * 10 * 7
-    rounds = 400
+    rounds = 100
 
     def test(self):
 
@@ -272,7 +272,7 @@ class SmallTuples(Test):
 
     version = 0.3
     operations = 5*(1 + 3 + 6 + 2)
-    rounds = 80000
+    rounds = 800*16
 
     def test(self):
 
index 366f171bd9041d1009f8463b036b78459fc64a0e..86839b5c69ca093dd19bbd2dfc3b8da6ec985329 100644 (file)
@@ -10,7 +10,7 @@ class ConcatUnicode(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 60000
+    rounds = 600*7
 
     def test(self):
 
@@ -92,7 +92,7 @@ class CompareUnicode(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 150000
+    rounds = 1500*17
 
     def test(self):
 
@@ -174,7 +174,7 @@ class CreateUnicodeWithConcat(Test):
 
     version = 0.1
     operations = 10 * 5
-    rounds = 80000
+    rounds = 800*12
 
     def test(self):
 
@@ -249,7 +249,7 @@ class UnicodeSlicing(Test):
 
     version = 0.1
     operations = 5 * 7
-    rounds = 100000
+    rounds = 10000
 
     def test(self):
 
@@ -310,7 +310,7 @@ class UnicodeMappings(Test):
 
     version = 0.1
     operations = 3 * (5 + 4 + 2 + 1)
-    rounds = 10000
+    rounds = 100*15
 
     def test(self):
 
@@ -383,7 +383,7 @@ class UnicodePredicates(Test):
 
     version = 0.1
     operations = 5 * 9
-    rounds = 100000
+    rounds = 1000*25
 
     def test(self):
 
@@ -460,7 +460,7 @@ else:
 
         version = 0.1
         operations = 5 * 8
-        rounds = 100000
+        rounds = 1000*15
 
         def test(self):
 
index b20c3f329913bd0552405278e0f05059376e555d..f190d77a923a7e7d083ba4810c56ccaf9a8af6bc 100755 (executable)
@@ -35,7 +35,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
 """
 
 # Version number
-__version__ = '1.3'
+__version__ = '1.4'
 
 #
 # NOTE: Use xrange for all test loops unless you want to face
@@ -98,7 +98,7 @@ class Test:
     # Number of rounds to execute per test run. This should be
     # adjusted to a figure that results in a test run-time of between
     # 20-50 seconds.
-    rounds = 100000
+    rounds = 10000
 
     ### Internal variables
 
@@ -115,6 +115,8 @@ class Test:
 
         if warp > 1:
             self.rounds = self.rounds / warp
+            if self.rounds == 0:
+                self.rounds = 1
             self.warp = warp
         self.times = []
         self.overhead = []
@@ -137,12 +139,13 @@ class Test:
         cruns = self.cruns
         # first calibrate
         offset = 0.0
-        for i in range(cruns):
-            t = clock()
-            calibrate()
-            t = clock() - t
-            offset = offset + t
-        offset = offset / cruns
+        if cruns:
+            for i in range(cruns):
+                t = clock()
+                calibrate()
+                t = clock() - t
+                offset = offset + t
+            offset = offset / cruns
         # now the real thing
         t = clock()
         test()
@@ -175,13 +178,18 @@ class Test:
 
     def stat(self):
 
-        """ Returns two value: average time per run and average per
-            operation.
+        """ Returns four values:
+        minimum round time
+        average time per round
+        average time per operation
+        average overhead time
 
+        XXX Should this take warp factors into account?
         """
         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 +199,7 @@ class Test:
         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
 
@@ -210,105 +218,132 @@ class Benchmark:
     roundtime = 0               # Average round time
     version = None              # Benchmark version number (see __init__)
                                 # as float x.yy
-    starttime = None            # Benchmark start time
 
     def __init__(self):
 
         self.tests = {}
         self.version = 0.31
 
-    def load_tests(self,setupmod,warp=1):
+    def load_tests(self, setupmod, warp=1, limitnames="", verbose=0):
 
         self.warp = warp
+        if limitnames:
+            limitnames = re.compile(limitnames, re.I)
+        else:
+            limitnames = None
         tests = self.tests
-        print 'Searching for tests...'
+        if verbose:
+            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
+        if verbose:
+            print
+            for t in l:
+                print '  ', t
+            print len(l), "tests found"
         print
 
-    def run(self):
+    def run(self, verbose):
 
         tests = self.tests.items()
         tests.sort()
         clock = time.clock
-        print 'Running %i round(s) of the suite: ' % self.rounds
+        print 'Running %i round(s) of the suite at warp factor %i:' % (self.rounds, self.warp)
         print
-        self.starttime = time.time()
         roundtime = clock()
         for i in range(self.rounds):
-            print ' Round %-25i  real   abs    overhead' % (i+1)
+            roundstarttime = clock()
+            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 in %.3f seconds' % (i+1, (clock() - roundstarttime))
         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
-            for name,t in tests:
-                avg,op_avg,ov_avg = t.stat()
+            totalmintime = other_totalmintime = 0
+            for name, t in tests:
+                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*self.warp)/(mintime1*other.warp) - 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 * compare_to.warp/self.warp, avg*1000.0,diff)
+            print '-'*77
+            #
+            # Summarise test results
+            #
             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 * compare_to.warp/self.warp,
+                       ((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 +374,12 @@ class PyBenchCmdline(Application):
                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', ''),
+               ArgumentOption('-C', 'number of calibration runs (default 0)', '')
                ]
 
     about = """\
@@ -380,6 +420,11 @@ python pybench.py -s p15 -c p14
         hidenoise = self.values['-d']
         warp = self.values['-w']
         nogc = self.values['--no-gc']
+        limitnames = self.values['-t']
+        verbose = self.verbose
+        nosyscheck = self.values['--no-syscheck']
+        
+        print 'PYBENCH',__version__
 
         # Switch off GC
         if nogc:
@@ -390,8 +435,13 @@ python pybench.py -s p15 -c p14
             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 +486,9 @@ python pybench.py -s p15 -c p14
         # Create benchmark object
         bench = Benchmark()
         bench.rounds = rounds
-        bench.load_tests(Setup,warp)
+        bench.load_tests(Setup, warp, limitnames, verbose)
         try:
-            bench.run()
+            bench.run(verbose)
         except KeyboardInterrupt:
             print
             print '*** KeyboardInterrupt -- Aborting'