mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Add -t option to allow easy test selection.
Action verbose option correctly. Tweak operation counts. Add empty and new instances tests. Enable comparisons across different warp factors. Change version.
This commit is contained in:
parent
0cbf2c5785
commit
431a76314d
17 changed files with 255 additions and 111 deletions
|
@ -4,7 +4,7 @@ class SimpleIntegerArithmetic(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
||||||
rounds = 120000
|
rounds = 1200*21
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ class SimpleFloatArithmetic(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
||||||
rounds = 100000
|
rounds = 1000*30
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ class SimpleIntFloatArithmetic(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
||||||
rounds = 120000
|
rounds = 1200*30
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -470,7 +470,7 @@ class SimpleLongArithmetic(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
||||||
rounds = 30000
|
rounds = 300*32
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -625,7 +625,7 @@ class SimpleComplexArithmetic(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
operations = 5 * (3 + 5 + 5 + 3 + 3 + 3)
|
||||||
rounds = 40000
|
rounds = 400*27
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class PythonFunctionCalls(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(1+4+4+2)
|
operations = 5*(1+4+4+2)
|
||||||
rounds = 60000
|
rounds = 600*22
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ class BuiltinFunctionCalls(Test):
|
||||||
|
|
||||||
version = 0.4
|
version = 0.4
|
||||||
operations = 5*(2+5+5+5)
|
operations = 5*(2+5+5+5)
|
||||||
rounds = 30000
|
rounds = 300*24
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -234,7 +234,7 @@ class PythonMethodCalls(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(6 + 5 + 4)
|
operations = 5*(6 + 5 + 4)
|
||||||
rounds = 20000
|
rounds = 200*27
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ class Recursion(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5
|
operations = 5
|
||||||
rounds = 50000
|
rounds = 500*21
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class IfThenElse(Test):
|
||||||
|
|
||||||
version = 0.31
|
version = 0.31
|
||||||
operations = 30*3 # hard to say...
|
operations = 30*3 # hard to say...
|
||||||
rounds = 150000
|
rounds = 1500*27
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -471,7 +471,7 @@ class NestedForLoops(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 1000*10*5
|
operations = 1000*10*5
|
||||||
rounds = 150
|
rounds = 100
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -496,7 +496,7 @@ class ForLoops(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 5
|
operations = 5 * 5
|
||||||
rounds = 8000
|
rounds = 80*25
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class DictCreation(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(5 + 5)
|
operations = 5*(5 + 5)
|
||||||
rounds = 60000
|
rounds = 600*24
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ class DictWithStringKeys(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5*(6 + 6)
|
operations = 5*(6 + 6)
|
||||||
rounds = 200000
|
rounds = 2000*30
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ class DictWithFloatKeys(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5*(6 + 6)
|
operations = 5*(6 + 6)
|
||||||
rounds = 200000
|
rounds = 20000
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ class DictWithIntegerKeys(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5*(6 + 6)
|
operations = 5*(6 + 6)
|
||||||
rounds = 200000
|
rounds = 2000*19
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ class SimpleDictManipulation(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(6 + 6 + 6 + 6)
|
operations = 5*(6 + 6 + 6 + 6)
|
||||||
rounds = 50000
|
rounds = 500*44
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
23
Tools/pybench/Empty.py
Executable file
23
Tools/pybench/Empty.py
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
from pybench import Test
|
||||||
|
|
||||||
|
class EmptyTest(Test):
|
||||||
|
"""This is just here as a potential measure of repeatability."""
|
||||||
|
|
||||||
|
version = 0.3
|
||||||
|
operations = 1
|
||||||
|
rounds = 60000
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
|
||||||
|
l = []
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def calibrate(self):
|
||||||
|
|
||||||
|
l = []
|
||||||
|
|
||||||
|
for i in xrange(self.rounds):
|
||||||
|
pass
|
||||||
|
|
|
@ -4,7 +4,7 @@ class TryRaiseExcept(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 2 + 3
|
operations = 2 + 3
|
||||||
rounds = 60000
|
rounds = 600*25
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ class TryExcept(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 15 * 10
|
operations = 15 * 10
|
||||||
rounds = 200000
|
rounds = 2000*16
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ class SecondImport(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 5
|
operations = 5 * 5
|
||||||
rounds = 20000
|
rounds = 2000*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class SecondPackageImport(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 5
|
operations = 5 * 5
|
||||||
rounds = 20000
|
rounds = 200*20
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ class SecondSubmoduleImport(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 5
|
operations = 5 * 5
|
||||||
rounds = 20000
|
rounds = 200*17
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class CreateInstances(Test):
|
||||||
|
|
||||||
version = 0.2
|
version = 0.2
|
||||||
operations = 3 + 7 + 4
|
operations = 3 + 7 + 4
|
||||||
rounds = 60000
|
rounds = 600*17
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class SimpleListManipulation(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5* (6 + 6 + 6)
|
operations = 5* (6 + 6 + 6)
|
||||||
rounds = 60000
|
rounds = 600*45
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ class ListSlicing(Test):
|
||||||
|
|
||||||
version = 0.4
|
version = 0.4
|
||||||
operations = 25*(3+1+2+1)
|
operations = 25*(3+1+2+1)
|
||||||
rounds = 400
|
rounds = 4*45
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ class SmallLists(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(1+ 6 + 6 + 3 + 1)
|
operations = 5*(1+ 6 + 6 + 3 + 1)
|
||||||
rounds = 60000
|
rounds = 600*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class SpecialClassAttribute(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(12 + 12)
|
operations = 5*(12 + 12)
|
||||||
rounds = 100000
|
rounds = 1000*16
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ class NormalClassAttribute(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(12 + 12)
|
operations = 5*(12 + 12)
|
||||||
rounds = 100000
|
rounds = 1000*20
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -371,7 +371,7 @@ class SpecialInstanceAttribute(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(12 + 12)
|
operations = 5*(12 + 12)
|
||||||
rounds = 100000
|
rounds = 1000*14
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -559,7 +559,7 @@ class NormalInstanceAttribute(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(12 + 12)
|
operations = 5*(12 + 12)
|
||||||
rounds = 100000
|
rounds = 1000*22
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -747,7 +747,7 @@ class BuiltinMethodLookup(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(3*5 + 3*5)
|
operations = 5*(3*5 + 3*5)
|
||||||
rounds = 70000
|
rounds = 700*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
66
Tools/pybench/NewInstances.py
Executable file
66
Tools/pybench/NewInstances.py
Executable file
|
@ -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
|
|
@ -4,7 +4,7 @@ class CompareIntegers(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 30 * 5
|
operations = 30 * 5
|
||||||
rounds = 120000
|
rounds = 1200*21
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ class CompareFloats(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 30 * 5
|
operations = 30 * 5
|
||||||
rounds = 60000
|
rounds = 600*27
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -396,7 +396,7 @@ class CompareFloatsIntegers(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 30 * 5
|
operations = 30 * 5
|
||||||
rounds = 60000
|
rounds = 600*16
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -592,7 +592,7 @@ class CompareLongs(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 30 * 5
|
operations = 30 * 5
|
||||||
rounds = 60000
|
rounds = 600*24
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,16 @@ Number_of_rounds = 10
|
||||||
Warp_factor = 20
|
Warp_factor = 20
|
||||||
|
|
||||||
# Import tests
|
# Import tests
|
||||||
|
#from Empty import *
|
||||||
from Arithmetic import *
|
from Arithmetic import *
|
||||||
from Calls import *
|
from Calls import *
|
||||||
from Constructs import *
|
from Constructs import *
|
||||||
from Lookups import *
|
from Lookups import *
|
||||||
from Instances import *
|
from Instances import *
|
||||||
|
try:
|
||||||
|
from NewInstances import *
|
||||||
|
except:
|
||||||
|
print "Cannot test new-style objects"
|
||||||
from Lists import *
|
from Lists import *
|
||||||
from Tuples import *
|
from Tuples import *
|
||||||
from Dict import *
|
from Dict import *
|
||||||
|
|
|
@ -5,7 +5,7 @@ class ConcatStrings(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 60000
|
rounds = 6000
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class CompareStrings(Test):
|
||||||
|
|
||||||
version = 0.2
|
version = 0.2
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 200000
|
rounds = 2000*22
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ class CompareInternedStrings(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 200000
|
rounds = 2000*28
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ class CreateStringsWithConcat(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 80000
|
rounds = 800*32
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ class StringSlicing(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 7
|
operations = 5 * 7
|
||||||
rounds = 100000
|
rounds = 1000*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -389,7 +389,7 @@ if hasattr('', 'lower'):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 3 * (5 + 4 + 2 + 1)
|
operations = 3 * (5 + 4 + 2 + 1)
|
||||||
rounds = 70000
|
rounds = 14000
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ if hasattr('', 'lower'):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 7
|
operations = 10 * 7
|
||||||
rounds = 80000
|
rounds = 800*24
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class TupleSlicing(Test):
|
||||||
|
|
||||||
version = 0.31
|
version = 0.31
|
||||||
operations = 3 * 25 * 10 * 7
|
operations = 3 * 25 * 10 * 7
|
||||||
rounds = 400
|
rounds = 100
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -272,7 +272,7 @@ class SmallTuples(Test):
|
||||||
|
|
||||||
version = 0.3
|
version = 0.3
|
||||||
operations = 5*(1 + 3 + 6 + 2)
|
operations = 5*(1 + 3 + 6 + 2)
|
||||||
rounds = 80000
|
rounds = 800*16
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ class ConcatUnicode(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 60000
|
rounds = 600*7
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ class CompareUnicode(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 150000
|
rounds = 1500*17
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ class CreateUnicodeWithConcat(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 10 * 5
|
operations = 10 * 5
|
||||||
rounds = 80000
|
rounds = 800*12
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -249,7 +249,7 @@ class UnicodeSlicing(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 7
|
operations = 5 * 7
|
||||||
rounds = 100000
|
rounds = 10000
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -310,7 +310,7 @@ class UnicodeMappings(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 3 * (5 + 4 + 2 + 1)
|
operations = 3 * (5 + 4 + 2 + 1)
|
||||||
rounds = 10000
|
rounds = 100*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -383,7 +383,7 @@ class UnicodePredicates(Test):
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 9
|
operations = 5 * 9
|
||||||
rounds = 100000
|
rounds = 1000*25
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ else:
|
||||||
|
|
||||||
version = 0.1
|
version = 0.1
|
||||||
operations = 5 * 8
|
operations = 5 * 8
|
||||||
rounds = 100000
|
rounds = 1000*15
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Version number
|
# Version number
|
||||||
__version__ = '1.3'
|
__version__ = '1.4'
|
||||||
|
|
||||||
#
|
#
|
||||||
# NOTE: Use xrange for all test loops unless you want to face
|
# 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
|
# Number of rounds to execute per test run. This should be
|
||||||
# adjusted to a figure that results in a test run-time of between
|
# adjusted to a figure that results in a test run-time of between
|
||||||
# 20-50 seconds.
|
# 20-50 seconds.
|
||||||
rounds = 100000
|
rounds = 10000
|
||||||
|
|
||||||
### Internal variables
|
### Internal variables
|
||||||
|
|
||||||
|
@ -115,6 +115,8 @@ class Test:
|
||||||
|
|
||||||
if warp > 1:
|
if warp > 1:
|
||||||
self.rounds = self.rounds / warp
|
self.rounds = self.rounds / warp
|
||||||
|
if self.rounds == 0:
|
||||||
|
self.rounds = 1
|
||||||
self.warp = warp
|
self.warp = warp
|
||||||
self.times = []
|
self.times = []
|
||||||
self.overhead = []
|
self.overhead = []
|
||||||
|
@ -137,12 +139,13 @@ class Test:
|
||||||
cruns = self.cruns
|
cruns = self.cruns
|
||||||
# first calibrate
|
# first calibrate
|
||||||
offset = 0.0
|
offset = 0.0
|
||||||
for i in range(cruns):
|
if cruns:
|
||||||
t = clock()
|
for i in range(cruns):
|
||||||
calibrate()
|
t = clock()
|
||||||
t = clock() - t
|
calibrate()
|
||||||
offset = offset + t
|
t = clock() - t
|
||||||
offset = offset / cruns
|
offset = offset + t
|
||||||
|
offset = offset / cruns
|
||||||
# now the real thing
|
# now the real thing
|
||||||
t = clock()
|
t = clock()
|
||||||
test()
|
test()
|
||||||
|
@ -175,13 +178,18 @@ class Test:
|
||||||
|
|
||||||
def stat(self):
|
def stat(self):
|
||||||
|
|
||||||
""" Returns two value: average time per run and average per
|
""" Returns four values:
|
||||||
operation.
|
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)
|
runs = len(self.times)
|
||||||
if runs == 0:
|
if runs == 0:
|
||||||
return 0,0
|
return 0,0
|
||||||
|
mintime = min(self.times)
|
||||||
totaltime = reduce(operator.add,self.times,0.0)
|
totaltime = reduce(operator.add,self.times,0.0)
|
||||||
avg = totaltime / float(runs)
|
avg = totaltime / float(runs)
|
||||||
op_avg = totaltime / float(runs * self.rounds * self.operations)
|
op_avg = totaltime / float(runs * self.rounds * self.operations)
|
||||||
|
@ -191,7 +199,7 @@ class Test:
|
||||||
else:
|
else:
|
||||||
# use self.last_timing - not too accurate
|
# use self.last_timing - not too accurate
|
||||||
ov_avg = self.last_timing[2]
|
ov_avg = self.last_timing[2]
|
||||||
return avg,op_avg,ov_avg
|
return mintime, avg, op_avg, ov_avg
|
||||||
|
|
||||||
### Load Setup
|
### Load Setup
|
||||||
|
|
||||||
|
@ -210,105 +218,132 @@ class Benchmark:
|
||||||
roundtime = 0 # Average round time
|
roundtime = 0 # Average round time
|
||||||
version = None # Benchmark version number (see __init__)
|
version = None # Benchmark version number (see __init__)
|
||||||
# as float x.yy
|
# as float x.yy
|
||||||
starttime = None # Benchmark start time
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self.tests = {}
|
self.tests = {}
|
||||||
self.version = 0.31
|
self.version = 0.31
|
||||||
|
|
||||||
def load_tests(self,setupmod,warp=1):
|
def load_tests(self, setupmod, warp=1, limitnames="", verbose=0):
|
||||||
|
|
||||||
self.warp = warp
|
self.warp = warp
|
||||||
|
if limitnames:
|
||||||
|
limitnames = re.compile(limitnames, re.I)
|
||||||
|
else:
|
||||||
|
limitnames = None
|
||||||
tests = self.tests
|
tests = self.tests
|
||||||
print 'Searching for tests...'
|
if verbose:
|
||||||
|
print 'Searching for tests ...',
|
||||||
setupmod.__dict__.values()
|
setupmod.__dict__.values()
|
||||||
for c in setupmod.__dict__.values():
|
for c in setupmod.__dict__.values():
|
||||||
if hasattr(c,'is_a_test') and c.__name__ != 'Test':
|
if not hasattr(c,'is_a_test'):
|
||||||
tests[c.__name__] = c(warp)
|
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 = tests.keys()
|
||||||
l.sort()
|
l.sort()
|
||||||
for t in l:
|
if verbose:
|
||||||
print ' ',t
|
print
|
||||||
|
for t in l:
|
||||||
|
print ' ', t
|
||||||
|
print len(l), "tests found"
|
||||||
print
|
print
|
||||||
|
|
||||||
def run(self):
|
def run(self, verbose):
|
||||||
|
|
||||||
tests = self.tests.items()
|
tests = self.tests.items()
|
||||||
tests.sort()
|
tests.sort()
|
||||||
clock = time.clock
|
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
|
print
|
||||||
self.starttime = time.time()
|
|
||||||
roundtime = clock()
|
roundtime = clock()
|
||||||
for i in range(self.rounds):
|
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)):
|
for j in range(len(tests)):
|
||||||
name,t = tests[j]
|
name,t = tests[j]
|
||||||
print '%30s:' % name,
|
if verbose:
|
||||||
|
print '%30s:' % name,
|
||||||
t.run()
|
t.run()
|
||||||
print ' %.3fr %.3fa %.3fo' % t.last_timing
|
if verbose:
|
||||||
print ' ----------------------'
|
print ' %.3fr %.3fa %.3fo' % t.last_timing
|
||||||
print ' Average round time: %.3f seconds' % \
|
if verbose:
|
||||||
((clock() - roundtime)/(i+1))
|
print ' ----------------------'
|
||||||
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
|
self.roundtime = (clock() - roundtime) / self.rounds
|
||||||
print
|
print
|
||||||
|
|
||||||
def print_stat(self, compare_to=None, hidenoise=0):
|
def print_stat(self, compare_to=None, hidenoise=0):
|
||||||
|
|
||||||
if not compare_to:
|
if not compare_to:
|
||||||
print '%-30s per run per oper. overhead' % 'Tests:'
|
print '%-30s min run avg run per oprn overhead' % 'Tests:'
|
||||||
print '-'*72
|
print '-'*77
|
||||||
tests = self.tests.items()
|
tests = self.tests.items()
|
||||||
tests.sort()
|
tests.sort()
|
||||||
|
totalmintime = 0
|
||||||
for name,t in tests:
|
for name,t in tests:
|
||||||
avg,op_avg,ov_avg = t.stat()
|
mintime,avg,op_avg,ov_avg = t.stat()
|
||||||
print '%30s: %10.2f ms %7.2f us %7.2f ms' % \
|
totalmintime += mintime
|
||||||
(name,avg*1000.0,op_avg*1000000.0,ov_avg*1000.0)
|
print '%30s: %9.2f ms %9.2f ms %6.2f us %6.2f' % \
|
||||||
print '-'*72
|
(name,mintime*1000.0,avg*1000.0,op_avg*1000000.0,ov_avg*1000.0)
|
||||||
print '%30s: %10.2f ms' % \
|
print '-'*77
|
||||||
('Average round time',self.roundtime * 1000.0)
|
print '%30s: %9.2f ms' % \
|
||||||
|
('Notional minimum round time', totalmintime * 1000.0)
|
||||||
|
|
||||||
else:
|
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:'
|
'Tests:'
|
||||||
print '-'*72
|
print '-'*77
|
||||||
tests = self.tests.items()
|
tests = self.tests.items()
|
||||||
tests.sort()
|
tests.sort()
|
||||||
compatible = 1
|
compatible = 1
|
||||||
for name,t in tests:
|
totalmintime = other_totalmintime = 0
|
||||||
avg,op_avg,ov_avg = t.stat()
|
for name, t in tests:
|
||||||
|
mintime, avg, op_avg, ov_avg = t.stat()
|
||||||
|
totalmintime += mintime
|
||||||
try:
|
try:
|
||||||
other = compare_to.tests[name]
|
other = compare_to.tests[name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
other = None
|
other = None
|
||||||
if other and other.version == t.version and \
|
if other and other.version == t.version and \
|
||||||
other.operations == t.operations:
|
other.operations == t.operations:
|
||||||
avg1,op_avg1,ov_avg1 = other.stat()
|
mintime1, avg1, op_avg1, ov_avg1 = other.stat()
|
||||||
qop_avg = (op_avg/op_avg1-1.0)*100.0
|
other_totalmintime += mintime1
|
||||||
|
diff = ((mintime*self.warp)/(mintime1*other.warp) - 1.0)*100.0
|
||||||
if hidenoise and abs(qop_avg) < 10:
|
if hidenoise and abs(qop_avg) < 10:
|
||||||
qop_avg = ''
|
diff = ''
|
||||||
else:
|
else:
|
||||||
qop_avg = '%+7.2f%%' % qop_avg
|
diff = '%+7.2f%%' % diff
|
||||||
else:
|
else:
|
||||||
qavg,qop_avg = 'n/a', 'n/a'
|
qavg, diff = 'n/a', 'n/a'
|
||||||
compatible = 0
|
compatible = 0
|
||||||
print '%30s: %10.2f ms %7.2f us %8s' % \
|
print '%30s: %8.2f ms %8.2f ms %8.2f ms %8s' % \
|
||||||
(name,avg*1000.0,op_avg*1000000.0,qop_avg)
|
(name,mintime*1000.0,mintime1*1000.0 * compare_to.warp/self.warp, avg*1000.0,diff)
|
||||||
print '-'*72
|
print '-'*77
|
||||||
|
#
|
||||||
|
# Summarise test results
|
||||||
|
#
|
||||||
if compatible and compare_to.roundtime > 0 and \
|
if compatible and compare_to.roundtime > 0 and \
|
||||||
compare_to.version == self.version:
|
compare_to.version == self.version:
|
||||||
print '%30s: %10.2f ms %+7.2f%%' % \
|
print '%30s: %8.2f ms %8.2f ms %+7.2f%%' % \
|
||||||
('Average round time',self.roundtime * 1000.0,
|
('Notional minimum round time', totalmintime * 1000.0,
|
||||||
((self.roundtime*self.warp)/
|
other_totalmintime * 1000.0 * compare_to.warp/self.warp,
|
||||||
(compare_to.roundtime*compare_to.warp)-1.0)*100.0)
|
((totalmintime*self.warp)/
|
||||||
|
(other_totalmintime*compare_to.warp)-1.0)*100.0)
|
||||||
else:
|
else:
|
||||||
print '%30s: %10.2f ms n/a' % \
|
print '%30s: %9.2f ms n/a' % \
|
||||||
('Average round time',self.roundtime * 1000.0)
|
('Notional minimum round time', totalmintime * 1000.0)
|
||||||
print
|
|
||||||
print '*) measured against: %s (rounds=%i, warp=%i)' % \
|
|
||||||
(compare_to.name,compare_to.rounds,compare_to.warp)
|
|
||||||
print
|
print
|
||||||
|
|
||||||
def print_machine():
|
def print_machine():
|
||||||
|
@ -339,7 +374,12 @@ class PyBenchCmdline(Application):
|
||||||
SwitchOption('-S','show statistics of benchmarks',0),
|
SwitchOption('-S','show statistics of benchmarks',0),
|
||||||
ArgumentOption('-w','set warp factor to arg',Setup.Warp_factor),
|
ArgumentOption('-w','set warp factor to arg',Setup.Warp_factor),
|
||||||
SwitchOption('-d','hide noise in compares', 0),
|
SwitchOption('-d','hide noise in compares', 0),
|
||||||
|
SwitchOption('-v','verbose output (not recommended)', 0),
|
||||||
SwitchOption('--no-gc','disable garbage collection', 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 = """\
|
about = """\
|
||||||
|
@ -380,6 +420,11 @@ python pybench.py -s p15 -c p14
|
||||||
hidenoise = self.values['-d']
|
hidenoise = self.values['-d']
|
||||||
warp = self.values['-w']
|
warp = self.values['-w']
|
||||||
nogc = self.values['--no-gc']
|
nogc = self.values['--no-gc']
|
||||||
|
limitnames = self.values['-t']
|
||||||
|
verbose = self.verbose
|
||||||
|
nosyscheck = self.values['--no-syscheck']
|
||||||
|
|
||||||
|
print 'PYBENCH',__version__
|
||||||
|
|
||||||
# Switch off GC
|
# Switch off GC
|
||||||
if nogc:
|
if nogc:
|
||||||
|
@ -390,8 +435,13 @@ python pybench.py -s p15 -c p14
|
||||||
else:
|
else:
|
||||||
if self.values['--no-gc']:
|
if self.values['--no-gc']:
|
||||||
gc.disable()
|
gc.disable()
|
||||||
|
print 'NO GC'
|
||||||
|
|
||||||
|
# maximise sys check interval
|
||||||
|
if nosyscheck:
|
||||||
|
sys.setcheckinterval(sys.maxint)
|
||||||
|
print 'CHECKINTERVAL =', sys.maxint
|
||||||
|
|
||||||
print 'PYBENCH',__version__
|
|
||||||
print
|
print
|
||||||
|
|
||||||
if not compare_to:
|
if not compare_to:
|
||||||
|
@ -436,9 +486,9 @@ python pybench.py -s p15 -c p14
|
||||||
# Create benchmark object
|
# Create benchmark object
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
bench.rounds = rounds
|
bench.rounds = rounds
|
||||||
bench.load_tests(Setup,warp)
|
bench.load_tests(Setup, warp, limitnames, verbose)
|
||||||
try:
|
try:
|
||||||
bench.run()
|
bench.run(verbose)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print
|
print
|
||||||
print '*** KeyboardInterrupt -- Aborting'
|
print '*** KeyboardInterrupt -- Aborting'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue