1""" 2"PYSTONE" Benchmark Program 3 4Version: Python/1.2 (corresponds to C/1.1 plus 3 Pystone fixes) 5 6Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. 7 8 Translated from ADA to C by Rick Richardson. 9 Every method to preserve ADA-likeness has been used, 10 at the expense of C-ness. 11 12 Translated from C to Python by Guido van Rossum. 13""" 14 15__version__ = "1.2" 16 17[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) 18 19 20class Record: 21 def __init__(self, PtrComp=None, Discr=0, EnumComp=0, IntComp=0, StringComp=0): 22 self.PtrComp = PtrComp 23 self.Discr = Discr 24 self.EnumComp = EnumComp 25 self.IntComp = IntComp 26 self.StringComp = StringComp 27 28 def copy(self): 29 return Record(self.PtrComp, self.Discr, self.EnumComp, self.IntComp, self.StringComp) 30 31 32TRUE = 1 33FALSE = 0 34 35 36def Setup(): 37 global IntGlob 38 global BoolGlob 39 global Char1Glob 40 global Char2Glob 41 global Array1Glob 42 global Array2Glob 43 44 IntGlob = 0 45 BoolGlob = FALSE 46 Char1Glob = "\0" 47 Char2Glob = "\0" 48 Array1Glob = [0] * 51 49 Array2Glob = [x[:] for x in [Array1Glob] * 51] 50 51 52def Proc0(loops): 53 global IntGlob 54 global BoolGlob 55 global Char1Glob 56 global Char2Glob 57 global Array1Glob 58 global Array2Glob 59 global PtrGlb 60 global PtrGlbNext 61 62 PtrGlbNext = Record() 63 PtrGlb = Record() 64 PtrGlb.PtrComp = PtrGlbNext 65 PtrGlb.Discr = Ident1 66 PtrGlb.EnumComp = Ident3 67 PtrGlb.IntComp = 40 68 PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" 69 String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" 70 Array2Glob[8][7] = 10 71 72 for i in range(loops): 73 Proc5() 74 Proc4() 75 IntLoc1 = 2 76 IntLoc2 = 3 77 String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" 78 EnumLoc = Ident2 79 BoolGlob = not Func2(String1Loc, String2Loc) 80 while IntLoc1 < IntLoc2: 81 IntLoc3 = 5 * IntLoc1 - IntLoc2 82 IntLoc3 = Proc7(IntLoc1, IntLoc2) 83 IntLoc1 = IntLoc1 + 1 84 Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) 85 PtrGlb = Proc1(PtrGlb) 86 CharIndex = "A" 87 while CharIndex <= Char2Glob: 88 if EnumLoc == Func1(CharIndex, "C"): 89 EnumLoc = Proc6(Ident1) 90 CharIndex = chr(ord(CharIndex) + 1) 91 IntLoc3 = IntLoc2 * IntLoc1 92 IntLoc2 = IntLoc3 // IntLoc1 93 IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 94 IntLoc1 = Proc2(IntLoc1) 95 96 97def Proc1(PtrParIn): 98 PtrParIn.PtrComp = NextRecord = PtrGlb.copy() 99 PtrParIn.IntComp = 5 100 NextRecord.IntComp = PtrParIn.IntComp 101 NextRecord.PtrComp = PtrParIn.PtrComp 102 NextRecord.PtrComp = Proc3(NextRecord.PtrComp) 103 if NextRecord.Discr == Ident1: 104 NextRecord.IntComp = 6 105 NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) 106 NextRecord.PtrComp = PtrGlb.PtrComp 107 NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) 108 else: 109 PtrParIn = NextRecord.copy() 110 NextRecord.PtrComp = None 111 return PtrParIn 112 113 114def Proc2(IntParIO): 115 IntLoc = IntParIO + 10 116 while 1: 117 if Char1Glob == "A": 118 IntLoc = IntLoc - 1 119 IntParIO = IntLoc - IntGlob 120 EnumLoc = Ident1 121 if EnumLoc == Ident1: 122 break 123 return IntParIO 124 125 126def Proc3(PtrParOut): 127 global IntGlob 128 129 if PtrGlb is not None: 130 PtrParOut = PtrGlb.PtrComp 131 else: 132 IntGlob = 100 133 PtrGlb.IntComp = Proc7(10, IntGlob) 134 return PtrParOut 135 136 137def Proc4(): 138 global Char2Glob 139 140 BoolLoc = Char1Glob == "A" 141 BoolLoc = BoolLoc or BoolGlob 142 Char2Glob = "B" 143 144 145def Proc5(): 146 global Char1Glob 147 global BoolGlob 148 149 Char1Glob = "A" 150 BoolGlob = FALSE 151 152 153def Proc6(EnumParIn): 154 EnumParOut = EnumParIn 155 if not Func3(EnumParIn): 156 EnumParOut = Ident4 157 if EnumParIn == Ident1: 158 EnumParOut = Ident1 159 elif EnumParIn == Ident2: 160 if IntGlob > 100: 161 EnumParOut = Ident1 162 else: 163 EnumParOut = Ident4 164 elif EnumParIn == Ident3: 165 EnumParOut = Ident2 166 elif EnumParIn == Ident4: 167 pass 168 elif EnumParIn == Ident5: 169 EnumParOut = Ident3 170 return EnumParOut 171 172 173def Proc7(IntParI1, IntParI2): 174 IntLoc = IntParI1 + 2 175 IntParOut = IntParI2 + IntLoc 176 return IntParOut 177 178 179def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): 180 global IntGlob 181 182 IntLoc = IntParI1 + 5 183 Array1Par[IntLoc] = IntParI2 184 Array1Par[IntLoc + 1] = Array1Par[IntLoc] 185 Array1Par[IntLoc + 30] = IntLoc 186 for IntIndex in range(IntLoc, IntLoc + 2): 187 Array2Par[IntLoc][IntIndex] = IntLoc 188 Array2Par[IntLoc][IntLoc - 1] = Array2Par[IntLoc][IntLoc - 1] + 1 189 Array2Par[IntLoc + 20][IntLoc] = Array1Par[IntLoc] 190 IntGlob = 5 191 192 193def Func1(CharPar1, CharPar2): 194 CharLoc1 = CharPar1 195 CharLoc2 = CharLoc1 196 if CharLoc2 != CharPar2: 197 return Ident1 198 else: 199 return Ident2 200 201 202def Func2(StrParI1, StrParI2): 203 IntLoc = 1 204 while IntLoc <= 1: 205 if Func1(StrParI1[IntLoc], StrParI2[IntLoc + 1]) == Ident1: 206 CharLoc = "A" 207 IntLoc = IntLoc + 1 208 if CharLoc >= "W" and CharLoc <= "Z": 209 IntLoc = 7 210 if CharLoc == "X": 211 return TRUE 212 else: 213 if StrParI1 > StrParI2: 214 IntLoc = IntLoc + 7 215 return TRUE 216 else: 217 return FALSE 218 219 220def Func3(EnumParIn): 221 EnumLoc = EnumParIn 222 if EnumLoc == Ident3: 223 return TRUE 224 return FALSE 225 226 227########################################################################### 228# Benchmark interface 229 230bm_params = { 231 (50, 10): (80,), 232 (100, 10): (300,), 233 (1000, 10): (4000,), 234 (5000, 10): (20000,), 235} 236 237 238def bm_setup(params): 239 Setup() 240 return lambda: Proc0(params[0]), lambda: (params[0], 0) 241