symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/pystone.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 #! /usr/bin/env python
       
     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 LOOPS = 50000
       
    36 
       
    37 from time import clock
       
    38 
       
    39 __version__ = "1.1"
       
    40 
       
    41 [Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6)
       
    42 
       
    43 class Record:
       
    44 
       
    45     def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0,
       
    46                        IntComp = 0, StringComp = 0):
       
    47         self.PtrComp = PtrComp
       
    48         self.Discr = Discr
       
    49         self.EnumComp = EnumComp
       
    50         self.IntComp = IntComp
       
    51         self.StringComp = StringComp
       
    52 
       
    53     def copy(self):
       
    54         return Record(self.PtrComp, self.Discr, self.EnumComp,
       
    55                       self.IntComp, self.StringComp)
       
    56 
       
    57 TRUE = 1
       
    58 FALSE = 0
       
    59 
       
    60 def main(loops=LOOPS):
       
    61     benchtime, stones = pystones(loops)
       
    62     print "Pystone(%s) time for %d passes = %g" % \
       
    63           (__version__, loops, benchtime)
       
    64     print "This machine benchmarks at %g pystones/second" % stones
       
    65 
       
    66 
       
    67 def pystones(loops=LOOPS):
       
    68     return Proc0(loops)
       
    69 
       
    70 IntGlob = 0
       
    71 BoolGlob = FALSE
       
    72 Char1Glob = '\0'
       
    73 Char2Glob = '\0'
       
    74 Array1Glob = [0]*51
       
    75 Array2Glob = map(lambda x: x[:], [Array1Glob]*51)
       
    76 PtrGlb = None
       
    77 PtrGlbNext = None
       
    78 
       
    79 def Proc0(loops=LOOPS):
       
    80     global IntGlob
       
    81     global BoolGlob
       
    82     global Char1Glob
       
    83     global Char2Glob
       
    84     global Array1Glob
       
    85     global Array2Glob
       
    86     global PtrGlb
       
    87     global PtrGlbNext
       
    88 
       
    89     starttime = clock()
       
    90     for i in range(loops):
       
    91         pass
       
    92     nulltime = clock() - starttime
       
    93 
       
    94     PtrGlbNext = Record()
       
    95     PtrGlb = Record()
       
    96     PtrGlb.PtrComp = PtrGlbNext
       
    97     PtrGlb.Discr = Ident1
       
    98     PtrGlb.EnumComp = Ident3
       
    99     PtrGlb.IntComp = 40
       
   100     PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING"
       
   101     String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING"
       
   102     Array2Glob[8][7] = 10
       
   103 
       
   104     starttime = clock()
       
   105 
       
   106     for i in range(loops):
       
   107         Proc5()
       
   108         Proc4()
       
   109         IntLoc1 = 2
       
   110         IntLoc2 = 3
       
   111         String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING"
       
   112         EnumLoc = Ident2
       
   113         BoolGlob = not Func2(String1Loc, String2Loc)
       
   114         while IntLoc1 < IntLoc2:
       
   115             IntLoc3 = 5 * IntLoc1 - IntLoc2
       
   116             IntLoc3 = Proc7(IntLoc1, IntLoc2)
       
   117             IntLoc1 = IntLoc1 + 1
       
   118         Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3)
       
   119         PtrGlb = Proc1(PtrGlb)
       
   120         CharIndex = 'A'
       
   121         while CharIndex <= Char2Glob:
       
   122             if EnumLoc == Func1(CharIndex, 'C'):
       
   123                 EnumLoc = Proc6(Ident1)
       
   124             CharIndex = chr(ord(CharIndex)+1)
       
   125         IntLoc3 = IntLoc2 * IntLoc1
       
   126         IntLoc2 = IntLoc3 / IntLoc1
       
   127         IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1
       
   128         IntLoc1 = Proc2(IntLoc1)
       
   129 
       
   130     benchtime = clock() - starttime - nulltime
       
   131     if benchtime == 0.0:
       
   132         loopsPerBenchtime = 0.0
       
   133     else:
       
   134         loopsPerBenchtime = (loops / benchtime)
       
   135     return benchtime, loopsPerBenchtime
       
   136 
       
   137 def Proc1(PtrParIn):
       
   138     PtrParIn.PtrComp = NextRecord = PtrGlb.copy()
       
   139     PtrParIn.IntComp = 5
       
   140     NextRecord.IntComp = PtrParIn.IntComp
       
   141     NextRecord.PtrComp = PtrParIn.PtrComp
       
   142     NextRecord.PtrComp = Proc3(NextRecord.PtrComp)
       
   143     if NextRecord.Discr == Ident1:
       
   144         NextRecord.IntComp = 6
       
   145         NextRecord.EnumComp = Proc6(PtrParIn.EnumComp)
       
   146         NextRecord.PtrComp = PtrGlb.PtrComp
       
   147         NextRecord.IntComp = Proc7(NextRecord.IntComp, 10)
       
   148     else:
       
   149         PtrParIn = NextRecord.copy()
       
   150     NextRecord.PtrComp = None
       
   151     return PtrParIn
       
   152 
       
   153 def Proc2(IntParIO):
       
   154     IntLoc = IntParIO + 10
       
   155     while 1:
       
   156         if Char1Glob == 'A':
       
   157             IntLoc = IntLoc - 1
       
   158             IntParIO = IntLoc - IntGlob
       
   159             EnumLoc = Ident1
       
   160         if EnumLoc == Ident1:
       
   161             break
       
   162     return IntParIO
       
   163 
       
   164 def Proc3(PtrParOut):
       
   165     global IntGlob
       
   166 
       
   167     if PtrGlb is not None:
       
   168         PtrParOut = PtrGlb.PtrComp
       
   169     else:
       
   170         IntGlob = 100
       
   171     PtrGlb.IntComp = Proc7(10, IntGlob)
       
   172     return PtrParOut
       
   173 
       
   174 def Proc4():
       
   175     global Char2Glob
       
   176 
       
   177     BoolLoc = Char1Glob == 'A'
       
   178     BoolLoc = BoolLoc or BoolGlob
       
   179     Char2Glob = 'B'
       
   180 
       
   181 def Proc5():
       
   182     global Char1Glob
       
   183     global BoolGlob
       
   184 
       
   185     Char1Glob = 'A'
       
   186     BoolGlob = FALSE
       
   187 
       
   188 def Proc6(EnumParIn):
       
   189     EnumParOut = EnumParIn
       
   190     if not Func3(EnumParIn):
       
   191         EnumParOut = Ident4
       
   192     if EnumParIn == Ident1:
       
   193         EnumParOut = Ident1
       
   194     elif EnumParIn == Ident2:
       
   195         if IntGlob > 100:
       
   196             EnumParOut = Ident1
       
   197         else:
       
   198             EnumParOut = Ident4
       
   199     elif EnumParIn == Ident3:
       
   200         EnumParOut = Ident2
       
   201     elif EnumParIn == Ident4:
       
   202         pass
       
   203     elif EnumParIn == Ident5:
       
   204         EnumParOut = Ident3
       
   205     return EnumParOut
       
   206 
       
   207 def Proc7(IntParI1, IntParI2):
       
   208     IntLoc = IntParI1 + 2
       
   209     IntParOut = IntParI2 + IntLoc
       
   210     return IntParOut
       
   211 
       
   212 def Proc8(Array1Par, Array2Par, IntParI1, IntParI2):
       
   213     global IntGlob
       
   214 
       
   215     IntLoc = IntParI1 + 5
       
   216     Array1Par[IntLoc] = IntParI2
       
   217     Array1Par[IntLoc+1] = Array1Par[IntLoc]
       
   218     Array1Par[IntLoc+30] = IntLoc
       
   219     for IntIndex in range(IntLoc, IntLoc+2):
       
   220         Array2Par[IntLoc][IntIndex] = IntLoc
       
   221     Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1
       
   222     Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc]
       
   223     IntGlob = 5
       
   224 
       
   225 def Func1(CharPar1, CharPar2):
       
   226     CharLoc1 = CharPar1
       
   227     CharLoc2 = CharLoc1
       
   228     if CharLoc2 != CharPar2:
       
   229         return Ident1
       
   230     else:
       
   231         return Ident2
       
   232 
       
   233 def Func2(StrParI1, StrParI2):
       
   234     IntLoc = 1
       
   235     while IntLoc <= 1:
       
   236         if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1:
       
   237             CharLoc = 'A'
       
   238             IntLoc = IntLoc + 1
       
   239     if CharLoc >= 'W' and CharLoc <= 'Z':
       
   240         IntLoc = 7
       
   241     if CharLoc == 'X':
       
   242         return TRUE
       
   243     else:
       
   244         if StrParI1 > StrParI2:
       
   245             IntLoc = IntLoc + 7
       
   246             return TRUE
       
   247         else:
       
   248             return FALSE
       
   249 
       
   250 def Func3(EnumParIn):
       
   251     EnumLoc = EnumParIn
       
   252     if EnumLoc == Ident3: return TRUE
       
   253     return FALSE
       
   254 
       
   255 if __name__ == '__main__':
       
   256     import sys
       
   257     def error(msg):
       
   258         print >>sys.stderr, msg,
       
   259         print >>sys.stderr, "usage: %s [number_of_loops]" % sys.argv[0]
       
   260         sys.exit(100)
       
   261     nargs = len(sys.argv) - 1
       
   262     if nargs > 1:
       
   263         error("%d arguments are too many;" % nargs)
       
   264     elif nargs == 1:
       
   265         try: loops = int(sys.argv[1])
       
   266         except ValueError:
       
   267             error("Invalid argument %r;" % sys.argv[1])
       
   268     else:
       
   269         loops = LOOPS
       
   270     main(loops)