comparison planemo/lib/python3.7/site-packages/future/backports/test/pystone.py @ 0:d30785e31577 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:18:57 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d30785e31577
1 #!/usr/bin/env python3
2
3 """
4 "PYSTONE" Benchmark Program
5
6 Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes)
7
8 Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013.
9
10 Translated from ADA to C by Rick Richardson.
11 Every method to preserve ADA-likeness has been used,
12 at the expense of C-ness.
13
14 Translated from C to Python by Guido van Rossum.
15
16 Version History:
17
18 Version 1.1 corrects two bugs in version 1.0:
19
20 First, it leaked memory: in Proc1(), NextRecord ends
21 up having a pointer to itself. I have corrected this
22 by zapping NextRecord.PtrComp at the end of Proc1().
23
24 Second, Proc3() used the operator != to compare a
25 record to None. This is rather inefficient and not
26 true to the intention of the original benchmark (where
27 a pointer comparison to None is intended; the !=
28 operator attempts to find a method __cmp__ to do value
29 comparison of the record). Version 1.1 runs 5-10
30 percent faster than version 1.0, so benchmark figures
31 of different versions can't be compared directly.
32
33 """
34
35 from __future__ import print_function
36
37 from time import clock
38
39 LOOPS = 50000
40
41 __version__ = "1.1"
42
43 [Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6)
44
45 class Record(object):
46
47 def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0,
48 IntComp = 0, StringComp = 0):
49 self.PtrComp = PtrComp
50 self.Discr = Discr
51 self.EnumComp = EnumComp
52 self.IntComp = IntComp
53 self.StringComp = StringComp
54
55 def copy(self):
56 return Record(self.PtrComp, self.Discr, self.EnumComp,
57 self.IntComp, self.StringComp)
58
59 TRUE = 1
60 FALSE = 0
61
62 def main(loops=LOOPS):
63 benchtime, stones = pystones(loops)
64 print("Pystone(%s) time for %d passes = %g" % \
65 (__version__, loops, benchtime))
66 print("This machine benchmarks at %g pystones/second" % stones)
67
68
69 def pystones(loops=LOOPS):
70 return Proc0(loops)
71
72 IntGlob = 0
73 BoolGlob = FALSE
74 Char1Glob = '\0'
75 Char2Glob = '\0'
76 Array1Glob = [0]*51
77 Array2Glob = [x[:] for x in [Array1Glob]*51]
78 PtrGlb = None
79 PtrGlbNext = None
80
81 def Proc0(loops=LOOPS):
82 global IntGlob
83 global BoolGlob
84 global Char1Glob
85 global Char2Glob
86 global Array1Glob
87 global Array2Glob
88 global PtrGlb
89 global PtrGlbNext
90
91 starttime = clock()
92 for i in range(loops):
93 pass
94 nulltime = clock() - starttime
95
96 PtrGlbNext = Record()
97 PtrGlb = Record()
98 PtrGlb.PtrComp = PtrGlbNext
99 PtrGlb.Discr = Ident1
100 PtrGlb.EnumComp = Ident3
101 PtrGlb.IntComp = 40
102 PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING"
103 String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING"
104 Array2Glob[8][7] = 10
105
106 starttime = clock()
107
108 for i in range(loops):
109 Proc5()
110 Proc4()
111 IntLoc1 = 2
112 IntLoc2 = 3
113 String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING"
114 EnumLoc = Ident2
115 BoolGlob = not Func2(String1Loc, String2Loc)
116 while IntLoc1 < IntLoc2:
117 IntLoc3 = 5 * IntLoc1 - IntLoc2
118 IntLoc3 = Proc7(IntLoc1, IntLoc2)
119 IntLoc1 = IntLoc1 + 1
120 Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3)
121 PtrGlb = Proc1(PtrGlb)
122 CharIndex = 'A'
123 while CharIndex <= Char2Glob:
124 if EnumLoc == Func1(CharIndex, 'C'):
125 EnumLoc = Proc6(Ident1)
126 CharIndex = chr(ord(CharIndex)+1)
127 IntLoc3 = IntLoc2 * IntLoc1
128 IntLoc2 = IntLoc3 / IntLoc1
129 IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1
130 IntLoc1 = Proc2(IntLoc1)
131
132 benchtime = clock() - starttime - nulltime
133 if benchtime == 0.0:
134 loopsPerBenchtime = 0.0
135 else:
136 loopsPerBenchtime = (loops / benchtime)
137 return benchtime, loopsPerBenchtime
138
139 def Proc1(PtrParIn):
140 PtrParIn.PtrComp = NextRecord = PtrGlb.copy()
141 PtrParIn.IntComp = 5
142 NextRecord.IntComp = PtrParIn.IntComp
143 NextRecord.PtrComp = PtrParIn.PtrComp
144 NextRecord.PtrComp = Proc3(NextRecord.PtrComp)
145 if NextRecord.Discr == Ident1:
146 NextRecord.IntComp = 6
147 NextRecord.EnumComp = Proc6(PtrParIn.EnumComp)
148 NextRecord.PtrComp = PtrGlb.PtrComp
149 NextRecord.IntComp = Proc7(NextRecord.IntComp, 10)
150 else:
151 PtrParIn = NextRecord.copy()
152 NextRecord.PtrComp = None
153 return PtrParIn
154
155 def Proc2(IntParIO):
156 IntLoc = IntParIO + 10
157 while 1:
158 if Char1Glob == 'A':
159 IntLoc = IntLoc - 1
160 IntParIO = IntLoc - IntGlob
161 EnumLoc = Ident1
162 if EnumLoc == Ident1:
163 break
164 return IntParIO
165
166 def Proc3(PtrParOut):
167 global IntGlob
168
169 if PtrGlb is not None:
170 PtrParOut = PtrGlb.PtrComp
171 else:
172 IntGlob = 100
173 PtrGlb.IntComp = Proc7(10, IntGlob)
174 return PtrParOut
175
176 def Proc4():
177 global Char2Glob
178
179 BoolLoc = Char1Glob == 'A'
180 BoolLoc = BoolLoc or BoolGlob
181 Char2Glob = 'B'
182
183 def Proc5():
184 global Char1Glob
185 global BoolGlob
186
187 Char1Glob = 'A'
188 BoolGlob = FALSE
189
190 def Proc6(EnumParIn):
191 EnumParOut = EnumParIn
192 if not Func3(EnumParIn):
193 EnumParOut = Ident4
194 if EnumParIn == Ident1:
195 EnumParOut = Ident1
196 elif EnumParIn == Ident2:
197 if IntGlob > 100:
198 EnumParOut = Ident1
199 else:
200 EnumParOut = Ident4
201 elif EnumParIn == Ident3:
202 EnumParOut = Ident2
203 elif EnumParIn == Ident4:
204 pass
205 elif EnumParIn == Ident5:
206 EnumParOut = Ident3
207 return EnumParOut
208
209 def Proc7(IntParI1, IntParI2):
210 IntLoc = IntParI1 + 2
211 IntParOut = IntParI2 + IntLoc
212 return IntParOut
213
214 def Proc8(Array1Par, Array2Par, IntParI1, IntParI2):
215 global IntGlob
216
217 IntLoc = IntParI1 + 5
218 Array1Par[IntLoc] = IntParI2
219 Array1Par[IntLoc+1] = Array1Par[IntLoc]
220 Array1Par[IntLoc+30] = IntLoc
221 for IntIndex in range(IntLoc, IntLoc+2):
222 Array2Par[IntLoc][IntIndex] = IntLoc
223 Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1
224 Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc]
225 IntGlob = 5
226
227 def Func1(CharPar1, CharPar2):
228 CharLoc1 = CharPar1
229 CharLoc2 = CharLoc1
230 if CharLoc2 != CharPar2:
231 return Ident1
232 else:
233 return Ident2
234
235 def Func2(StrParI1, StrParI2):
236 IntLoc = 1
237 while IntLoc <= 1:
238 if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1:
239 CharLoc = 'A'
240 IntLoc = IntLoc + 1
241 if CharLoc >= 'W' and CharLoc <= 'Z':
242 IntLoc = 7
243 if CharLoc == 'X':
244 return TRUE
245 else:
246 if StrParI1 > StrParI2:
247 IntLoc = IntLoc + 7
248 return TRUE
249 else:
250 return FALSE
251
252 def Func3(EnumParIn):
253 EnumLoc = EnumParIn
254 if EnumLoc == Ident3: return TRUE
255 return FALSE
256
257 if __name__ == '__main__':
258 import sys
259 def error(msg):
260 print(msg, end=' ', file=sys.stderr)
261 print("usage: %s [number_of_loops]" % sys.argv[0], file=sys.stderr)
262 sys.exit(100)
263 nargs = len(sys.argv) - 1
264 if nargs > 1:
265 error("%d arguments are too many;" % nargs)
266 elif nargs == 1:
267 try: loops = int(sys.argv[1])
268 except ValueError:
269 error("Invalid argument %r;" % sys.argv[1])
270 else:
271 loops = LOOPS
272 main(loops)