Permalink
Fetching contributors…
Cannot retrieve contributors at this time
252 lines (217 sloc) 6.94 KB
#! /usr/bin/env converge
// "CVSTONE" Benchmark Program
//
// Version: Converge/1.0 (corresponds to Python/1.1 and 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.
//
// Translated from Python to Converge by Laurence Tratt.
//
LOOPS := 50000
import Builtins, Exceptions, Functional, Strings, Sys, Time
__version__ := "1.0"
Ident1, Ident2, Ident3, Ident4, Ident5 := [1, 2, 3, 4, 5]
class Record:
func init(self, PtrComp := null, Discr := 0, EnumComp := 0, IntComp := 0, StringComp := 0):
self.PtrComp := PtrComp
self.Discr := Discr
self.EnumComp := EnumComp
self.IntComp := IntComp
self.StringComp := StringComp
func copy(self):
return Record.new(self.PtrComp, self.Discr, self.EnumComp, self.IntComp, self.StringComp)
TRUE := 1
FALSE := 0
func main():
func error(msg):
Sys::stderr.writeln(msg)
Sys::stderr.writeln(Strings::format("usage: %s [number_of_loops]", Sys::program_path))
Sys::exit(100)
nargs := Sys::argv.len()
if nargs > 1:
error(Strings::format("%d arguments are too many;", nargs))
elif nargs == 1:
try:
loops := Builtins::Int.new(Sys::argv[0])
catch Exceptions::Number_Exception:
error(Strings::format("Invalid argument %r;", Sys::argv[0]))
else:
loops := LOOPS
benchtime, stones := cvstones(loops)
Sys::println(Strings::format("cvstone(%s) time for %d passes = %f", __version__, loops, benchtime))
Sys::println(Strings::format("This machine benchmarks at %d cvstones/second", Builtins::Int.new(stones)))
func cvstones(loops:=LOOPS):
return Proc0(loops)
IntGlob := 0
BoolGlob := FALSE
Char1Glob := "\0"
Char2Glob := "\0"
Array1Glob := [0]*51
Array2Glob := Functional::map(func (x) {return x[:]}, [Array1Glob]*51)
PtrGlb := null
PtrGlbNext := null
func Proc0(loops:=LOOPS):
nonlocal IntGlob, BoolGlob, Char1Glob, Char2Glob, Array1Glob, Array2Glob, PtrGlb, PtrGlbNext
starttime := Time::current_mono()
i := 0
while i < loops:
i += 1
nulltime := Time::current_mono() - starttime
PtrGlbNext := Record.new()
PtrGlb := Record.new()
PtrGlb.PtrComp := PtrGlbNext
PtrGlb.Discr := Ident1
PtrGlb.EnumComp := Ident3
PtrGlb.IntComp := 40
PtrGlb.StringComp := "DHRYSTONE PROGRAM, SOME STRING"
String1Loc := "DHRYSTONE PROGRAM, 1'ST STRING"
Array2Glob[8][7] := 10
starttime := Time::current_mono()
i := 0
while i < loops:
Proc5()
Proc4()
IntLoc1 := 2
IntLoc2 := 3
String2Loc := "DHRYSTONE PROGRAM, 2'ND STRING"
EnumLoc := Ident2
if Func2(String1Loc, String2Loc) == TRUE:
BoolGlob := FALSE
else:
BoolGlob := TRUE
while IntLoc1 < IntLoc2:
IntLoc3 := 5 * IntLoc1 - IntLoc2
IntLoc3 := Proc7(IntLoc1, IntLoc2)
IntLoc1 := IntLoc1 + 1
Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3)
PtrGlb := Proc1(PtrGlb)
CharIndex := "A"
while CharIndex <= Char2Glob:
if EnumLoc == Func1(CharIndex, "C"):
EnumLoc := Proc6(Ident1)
Sys::println(EnumLoc)
CharIndex := (CharIndex.int_val()+1).str_val()
IntLoc3 := IntLoc2 * IntLoc1
IntLoc2 := IntLoc3 / IntLoc1
IntLoc2 := 7 * (IntLoc3 - IntLoc2) - IntLoc1
IntLoc1 := Proc2(IntLoc1)
i += 1
benchtime := (Time::current_mono() - starttime - nulltime).as_float()
if benchtime == 0:
loopsPerBenchtime := 0
else:
loopsPerBenchtime := (loops / benchtime)
return [benchtime, loopsPerBenchtime]
func Proc1(PtrParIn):
PtrParIn.PtrComp := NextRecord := PtrGlb.copy()
PtrParIn.IntComp := 5
NextRecord.IntComp := PtrParIn.IntComp
NextRecord.PtrComp := PtrParIn.PtrComp
NextRecord.PtrComp := Proc3(NextRecord.PtrComp)
if NextRecord.Discr == Ident1:
NextRecord.IntComp := 6
NextRecord.EnumComp := Proc6(PtrParIn.EnumComp)
NextRecord.PtrComp := PtrGlb.PtrComp
NextRecord.IntComp := Proc7(NextRecord.IntComp, 10)
else:
PtrParIn := NextRecord.copy()
NextRecord.PtrComp := null
return PtrParIn
func Proc2(IntParIO):
IntLoc := IntParIO + 10
while 1:
if Char1Glob == "A":
IntLoc := IntLoc - 1
IntParIO := IntLoc - IntGlob
EnumLoc := Ident1
if EnumLoc == Ident1:
break
return IntParIO
func Proc3(PtrParOut):
nonlocal IntGlob
if PtrGlb is not null:
PtrParOut := PtrGlb.PtrComp
else:
IntGlob := 100
PtrGlb.IntComp := Proc7(10, IntGlob)
return PtrParOut
func Proc4():
nonlocal Char2Glob
if Char1Glob == "A":
BoolLoc := TRUE
BoolLoc := BoolLoc | BoolGlob
Char2Glob := "B"
func Proc5():
nonlocal Char1Glob, BoolGlob
Char1Glob := "A"
BoolGlob := FALSE
func Proc6(EnumParIn):
EnumParOut := EnumParIn
if Func3(EnumParIn) == FALSE:
EnumParOut := Ident4
if EnumParIn == Ident1:
EnumParOut := Ident1
elif EnumParIn == Ident2:
if IntGlob > 100:
EnumParOut := Ident1
else:
EnumParOut := Ident4
elif EnumParIn == Ident3:
EnumParOut := Ident2
elif EnumParIn == Ident4:
pass
elif EnumParIn == Ident5:
EnumParOut := Ident3
return EnumParOut
func Proc7(IntParI1, IntParI2):
IntLoc := IntParI1 + 2
IntParOut := IntParI2 + IntLoc
return IntParOut
func Proc8(Array1Par, Array2Par, IntParI1, IntParI2):
nonlocal IntGlob
IntLoc := IntParI1 + 5
Array1Par[IntLoc] := IntParI2
Array1Par[IntLoc+1] := Array1Par[IntLoc]
Array1Par[IntLoc+30] := IntLoc
IntIndex := IntLoc
while IntIndex < IntLoc+2:
Array2Par[IntLoc][IntIndex] := IntLoc
IntIndex += 1
Array2Par[IntLoc][IntLoc - 1] := Array2Par[IntLoc][IntLoc - 1] + 1
Array2Par[IntLoc+20][IntLoc] := Array1Par[IntLoc]
IntGlob := 5
func Func1(CharPar1, CharPar2):
CharLoc1 := CharPar1
CharLoc2 := CharLoc1
if CharLoc2 != CharPar2:
return Ident1
else:
return Ident2
func Func2(StrParI1, StrParI2):
IntLoc := 1
while IntLoc <= 1:
if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1:
CharLoc := "A"
IntLoc := IntLoc + 1
if CharLoc >= "W" & CharLoc <= "Z":
IntLoc := 7
if CharLoc == "X":
return TRUE
else:
if StrParI1 > StrParI2:
IntLoc := IntLoc + 7
return TRUE
else:
return FALSE
func Func3(EnumParIn):
EnumLoc := EnumParIn
if EnumLoc == Ident3:
return TRUE
return FALSE