"PYSTONE" Benchmark Program
Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes)
Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013.
Translated from ADA to C by Rick Richardson.
Every method to preserve ADA-likeness has been used,
at the expense of C-ness.
Translated from C to Python by Guido van Rossum.
Version 1.1 corrects two bugs in version 1.0:
First, it leaked memory: in Proc1(), NextRecord ends
up having a pointer to itself. I have corrected this
by zapping NextRecord.PtrComp at the end of Proc1().
Second, Proc3() used the operator != to compare a
record to None. This is rather inefficient and not
true to the intention of the original benchmark (where
a pointer comparison to None is intended; the !=
operator attempts to find a method __cmp__ to do value
comparison of the record). Version 1.1 runs 5-10
percent faster than version 1.0, so benchmark figures
of different versions can't be compared directly.
[Ident1
, Ident2
, Ident3
, Ident4
, Ident5
] = range(1, 6)
def __init__(self
, PtrComp
= None, Discr
= 0, EnumComp
= 0,
IntComp
= 0, StringComp
= 0):
self
.StringComp
= StringComp
return Record(self
.PtrComp
, self
.Discr
, self
.EnumComp
,
self
.IntComp
, self
.StringComp
)
benchtime
, stones
= pystones(loops
)
print "Pystone(%s) time for %d passes = %g" % \
(__version__
, loops
, benchtime
)
print "This machine benchmarks at %g pystones/second" % stones
def pystones(loops
=LOOPS
):
Array2Glob
= map(lambda x
: x
[:], [Array1Glob
]*51)
nulltime
= clock() - starttime
PtrGlb
.PtrComp
= PtrGlbNext
PtrGlb
.StringComp
= "DHRYSTONE PROGRAM, SOME STRING"
String1Loc
= "DHRYSTONE PROGRAM, 1'ST STRING"
String2Loc
= "DHRYSTONE PROGRAM, 2'ND STRING"
BoolGlob
= not Func2(String1Loc
, String2Loc
)
IntLoc3
= 5 * IntLoc1
- IntLoc2
IntLoc3
= Proc7(IntLoc1
, IntLoc2
)
Proc8(Array1Glob
, Array2Glob
, IntLoc1
, IntLoc3
)
while CharIndex
<= Char2Glob
:
if EnumLoc
== Func1(CharIndex
, 'C'):
CharIndex
= chr(ord(CharIndex
)+1)
IntLoc3
= IntLoc2
* IntLoc1
IntLoc2
= IntLoc3
/ IntLoc1
IntLoc2
= 7 * (IntLoc3
- IntLoc2
) - IntLoc1
benchtime
= clock() - starttime
- nulltime
return benchtime
, (loops
/ benchtime
)
PtrParIn
.PtrComp
= NextRecord
= PtrGlb
.copy()
NextRecord
.IntComp
= PtrParIn
.IntComp
NextRecord
.PtrComp
= PtrParIn
.PtrComp
NextRecord
.PtrComp
= Proc3(NextRecord
.PtrComp
)
if NextRecord
.Discr
== Ident1
:
NextRecord
.EnumComp
= Proc6(PtrParIn
.EnumComp
)
NextRecord
.PtrComp
= PtrGlb
.PtrComp
NextRecord
.IntComp
= Proc7(NextRecord
.IntComp
, 10)
PtrParIn
= NextRecord
.copy()
NextRecord
.PtrComp
= None
IntParIO
= IntLoc
- IntGlob
PtrParOut
= PtrGlb
.PtrComp
PtrGlb
.IntComp
= Proc7(10, IntGlob
)
BoolLoc
= Char1Glob
== 'A'
BoolLoc
= BoolLoc
or BoolGlob
elif EnumParIn
== Ident2
:
elif EnumParIn
== Ident3
:
elif EnumParIn
== Ident4
:
elif EnumParIn
== Ident5
:
def Proc7(IntParI1
, IntParI2
):
IntParOut
= IntParI2
+ IntLoc
def Proc8(Array1Par
, Array2Par
, IntParI1
, IntParI2
):
Array1Par
[IntLoc
] = IntParI2
Array1Par
[IntLoc
+1] = Array1Par
[IntLoc
]
Array1Par
[IntLoc
+30] = IntLoc
for IntIndex
in range(IntLoc
, IntLoc
+2):
Array2Par
[IntLoc
][IntIndex
] = IntLoc
Array2Par
[IntLoc
][IntLoc
-1] = Array2Par
[IntLoc
][IntLoc
-1] + 1
Array2Par
[IntLoc
+20][IntLoc
] = Array1Par
[IntLoc
]
def Func1(CharPar1
, CharPar2
):
def Func2(StrParI1
, StrParI2
):
if Func1(StrParI1
[IntLoc
], StrParI2
[IntLoc
+1]) == Ident1
:
if CharLoc
>= 'W' and CharLoc
<= 'Z':
if EnumLoc
== Ident3
: return TRUE
if __name__
== '__main__':
print >>sys
.stderr
, "usage: %s [number_of_loops]" % sys
.argv
[0]
nargs
= len(sys
.argv
) - 1
error("%d arguments are too many;" % nargs
)
try: loops
= int(sys
.argv
[1])
error("Invalid argument %r;" % sys
.argv
[1])