499 lines
7.5 KiB
Rexx
499 lines
7.5 KiB
Rexx
-- 7 Aug 2025
|
|
include Settings
|
|
arg count','prec
|
|
if count = '' then
|
|
count = 1e7
|
|
if prec = '' then
|
|
prec = 9
|
|
numeric digits prec
|
|
|
|
say 'TIME A FUNCTION'
|
|
say version
|
|
say
|
|
say 'Part 1: REXX clauses'
|
|
say
|
|
call Parameters
|
|
call DoLoop
|
|
call DoForLoop
|
|
call DoToLoop
|
|
call DoForByLoop
|
|
call DoToByLoop
|
|
say
|
|
call Tarra
|
|
call IntegerAssign
|
|
call IntegerAdd
|
|
call IntegerMultiply
|
|
call IntegerDivide1
|
|
call IntegerDivide2
|
|
call IntegerRemainder
|
|
call IntegerPower
|
|
say
|
|
call FloatAssign
|
|
call FloatAdd
|
|
call FloatMultiply
|
|
call FloatDivide1
|
|
call FloatDivide2
|
|
call FloatRemainder
|
|
call FloatPower
|
|
call FloatFormula
|
|
say
|
|
call StringFunctions
|
|
call NumericFunctions
|
|
call DateFunctions
|
|
call TimeFunctions
|
|
say
|
|
call FixedParseVar
|
|
call DynamicParseVar
|
|
call ParseValue
|
|
say
|
|
call NoOperation
|
|
say
|
|
call IfThen
|
|
call SelectWhen
|
|
say
|
|
call CallProc
|
|
call CallProcParms
|
|
call CallRout
|
|
call CallRoutParms
|
|
say
|
|
call Interpreting
|
|
say
|
|
call Output
|
|
call Input
|
|
say
|
|
call Stems
|
|
say
|
|
call Average
|
|
say
|
|
say 'Part 2: Profiler'
|
|
say
|
|
call Profiler 'ArcSin(X)',1/3
|
|
call Profiler 'Exp(X)',1/4
|
|
call Profiler 'Gamma(X)',1/5
|
|
call Profiler 'Ln(X)',1/6
|
|
call Profiler 'Pi()'
|
|
call Profiler 'Sin(X)',1/7
|
|
call Profiler 'Sqrt(X)',1/8
|
|
call Profiler 'X',1/9
|
|
call Profiler 'X**5-5/x-1',1/10
|
|
call Profiler 'Zeta(X)',1/11
|
|
return
|
|
|
|
Parameters:
|
|
start = date() time()
|
|
int1 = right(sqrt3(),prec%2); int2 = right(sqrt2(),prec%2)
|
|
if int2 > int1 then
|
|
parse value int2 int1 with int1 int2
|
|
float1 = sqrt3()/1; float2 = sqrt2()/1
|
|
tarra = 0; totelaps = 0; totcount = 0
|
|
return
|
|
|
|
DoLoop:
|
|
call Time('r')
|
|
do count
|
|
end
|
|
call Measure 'Do',1
|
|
return
|
|
|
|
DoForLoop:
|
|
call Time('r')
|
|
do n = 1 for count
|
|
end
|
|
call Measure 'Do for',1
|
|
return
|
|
|
|
DoToLoop:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
end
|
|
call Measure 'Do to',1
|
|
return
|
|
|
|
DoForByLoop:
|
|
call Time('r')
|
|
do n = 1 for count by 1
|
|
end
|
|
call Measure 'Do for by',1
|
|
return
|
|
|
|
DoToByLoop:
|
|
call Time('r')
|
|
do n = 1 to count by 1
|
|
end
|
|
call Measure 'Do to by',1
|
|
return
|
|
|
|
Tarra:
|
|
call Time('r')
|
|
do n = 1 to 1e8
|
|
end
|
|
tarra = Time('e')*count/1e8
|
|
return
|
|
|
|
IntegerAssign:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1
|
|
end
|
|
call Measure 'Integer assign',1
|
|
return
|
|
|
|
IntegerAdd:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1+int2
|
|
end
|
|
call Measure 'Integer +',1
|
|
return
|
|
|
|
IntegerMultiply:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1*int2
|
|
end
|
|
call Measure 'Integer *',1
|
|
return
|
|
|
|
IntegerDivide1:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1/int2
|
|
end
|
|
call Measure 'Integer /',1
|
|
return
|
|
|
|
IntegerDivide2:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1//int2
|
|
end
|
|
call Measure 'Integer //',1
|
|
return
|
|
|
|
IntegerRemainder:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1%int2
|
|
end
|
|
call Measure 'Integer %',1
|
|
return
|
|
|
|
IntegerPower:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = int1**2
|
|
end
|
|
call Measure 'Integer **',1
|
|
return
|
|
|
|
FloatAssign:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1
|
|
end
|
|
call Measure 'Float assign',1
|
|
return
|
|
|
|
FloatAdd:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1+float2
|
|
end
|
|
call Measure 'Float +',1
|
|
return
|
|
|
|
FloatMultiply:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1*float2
|
|
end
|
|
call Measure 'Float *',1
|
|
return
|
|
|
|
FloatDivide1:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1/float2
|
|
end
|
|
call Measure 'Float /',1
|
|
return
|
|
|
|
FloatDivide2:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1//float2
|
|
end
|
|
call Measure 'Float //',1
|
|
return
|
|
|
|
FloatRemainder:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1%float2
|
|
end
|
|
call Measure 'Float %',1
|
|
return
|
|
|
|
FloatPower:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = float1**2
|
|
end
|
|
call Measure 'Float **',1
|
|
return
|
|
|
|
FloatFormula:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
a = (float1+float2) + (float1*float2) + (float1/float2)
|
|
end
|
|
call Measure 'Float formula',1
|
|
return
|
|
|
|
StringFunctions:
|
|
a = 'This is the first text'; b = 'This is the second text'; c = float1
|
|
call Time('r')
|
|
do n = 1 to count
|
|
t = a||b
|
|
t = Abbrev('text',a)
|
|
t = Center(a,100)
|
|
t = Compare(a,b)
|
|
t = Copies(a,3)
|
|
t = Delstr(a,5,10)
|
|
t = Delword(a,2,3)
|
|
t = Format(c,1,5)
|
|
t = Insert(a,b,10)
|
|
t = Lastpos('text',a)
|
|
t = Left(a,10)
|
|
t = Length(a)
|
|
t = Overlay('xxx',a,3)
|
|
t = Pos('text',a)
|
|
t = Reverse(a)
|
|
t = Right(a,10)
|
|
t = Space(a)
|
|
t = Strip(a)
|
|
t = Substr(a,5,10)
|
|
t = Subword(a,2,2)
|
|
t = Translate(a,'xxx','the')
|
|
t = Verify(a,'the')
|
|
t = Word(a,3)
|
|
t = Wordindex(a,3)
|
|
t = Wordlength(a,3)
|
|
t = Wordpos('the',a)
|
|
t = Words(a)
|
|
t = Xrange('a','z')
|
|
end
|
|
call Measure 'String functions',28
|
|
return
|
|
|
|
NumericFunctions:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
t = Abs(float1)
|
|
t = Max(float1,float2)
|
|
t = Min(float1,float2)
|
|
t = Random()
|
|
t = Sign(float1)
|
|
t = Trunc(float1)
|
|
t = Digits()
|
|
end
|
|
call Measure 'Numeric functions',7
|
|
return
|
|
|
|
DateFunctions:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
t = Date('b')
|
|
t = Date('d')
|
|
t = Date('e')
|
|
t = Date('m')
|
|
t = Date('n')
|
|
t = Date('o')
|
|
t = Date('s')
|
|
t = Date('u')
|
|
t = Date('w')
|
|
end
|
|
call Measure 'Date functions',9
|
|
return
|
|
|
|
TimeFunctions:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
t = Time('c')
|
|
t = Time('e')
|
|
t = Time('h')
|
|
t = Time('l')
|
|
t = Time('m')
|
|
t = Time('n')
|
|
t = Time('s')
|
|
end
|
|
call Measure 'Time functions',7
|
|
return
|
|
|
|
FixedParseVar:
|
|
t = '1,2,3,4,5,6,7,8,9,10'
|
|
call Time('r')
|
|
do n = 1 to count
|
|
parse var t rec1 ',' rec2 ',' rec3 ',' rec4 ',' rec5 ',' rec6 ',' rec7 ',' rec8 ',' rec9 ',' rec10
|
|
end
|
|
call Measure 'Fixed parse var',1
|
|
return
|
|
|
|
DynamicParseVar:
|
|
t = '1,2,3,4,5,6,7,8,9,10'
|
|
call Time('r')
|
|
do n = 1 to count
|
|
do y = 1 to 10
|
|
parse var t rec.y ',' t
|
|
end
|
|
end
|
|
call Measure 'Dynamic parse var',1
|
|
return
|
|
|
|
Parsevalue:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
parse value float1 float2 with a,b
|
|
end
|
|
call Measure 'Parse value',1
|
|
return
|
|
|
|
NoOperation:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
nop
|
|
end
|
|
call Measure 'No operation',1
|
|
return
|
|
|
|
IfThen:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
if float1 = float1 then nop
|
|
end
|
|
call Measure 'If then',1
|
|
return
|
|
|
|
SelectWhen:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
select
|
|
when float1 = float1 then nop
|
|
end
|
|
end
|
|
call Measure 'Select when',1
|
|
return
|
|
|
|
CallProc:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
call Proc1
|
|
end
|
|
call Measure 'Call procedure',1
|
|
return
|
|
|
|
CallProcParms:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
call Proc2 1,2,3
|
|
end
|
|
call Measure 'Call procedure arg',1
|
|
return
|
|
|
|
CallRout:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
call Rout1
|
|
end
|
|
call Measure 'Call routine',1
|
|
return
|
|
|
|
CallRoutParms:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
call Rout2 1,2,3
|
|
end
|
|
call Measure 'Call routine arg',1
|
|
return
|
|
|
|
Proc1:
|
|
procedure
|
|
return
|
|
|
|
Proc2:
|
|
procedure
|
|
arg a,b,c
|
|
return
|
|
|
|
Rout1:
|
|
return
|
|
|
|
Rout2:
|
|
arg a,b,c
|
|
return
|
|
|
|
Interpreting:
|
|
a = 'nop'
|
|
call Time('r')
|
|
do n = 1 to count
|
|
interpret a
|
|
end
|
|
call Measure 'Interpret',1
|
|
return
|
|
|
|
Output:
|
|
file = 'dummy.txt'
|
|
call Lineout file,,1
|
|
call Time('r')
|
|
do n = 1 to count
|
|
call Lineout file,'Just a small line'
|
|
end
|
|
call Measure 'Output',1
|
|
return
|
|
|
|
Input:
|
|
file = 'dummy.txt'
|
|
call Time('r')
|
|
do n = 1 to count
|
|
t = Linein(file)
|
|
end
|
|
call Measure 'Input',1
|
|
return
|
|
|
|
Stems:
|
|
call Time('r')
|
|
do n = 1 to count
|
|
stem.n = n
|
|
end
|
|
call Measure 'Stem processing',1
|
|
return
|
|
|
|
Average:
|
|
totelaps = 1e6*totelaps/totcount
|
|
say Left('Average',20) round(totelaps,3) 'microsec =' round(1/totelaps,1) 'million clauses/sec'
|
|
say
|
|
say Left('Start run',20) start
|
|
say Left('Clauses processed',20) round(totcount/1e6,1) 'million'
|
|
say Left('Stop run',20) date() time()
|
|
return
|
|
|
|
Measure:
|
|
parse arg measure,clauses
|
|
elaps = Time('e')-tarra
|
|
if elaps > 0 then do
|
|
totelaps = totelaps+elaps; totcount = totcount+count*clauses
|
|
elaps = 1e6*elaps/(count*clauses)
|
|
say Left(measure,20) round(elaps,3) 'microsec =' round(1/elaps,1) 'million clauses/sec'
|
|
end
|
|
else
|
|
say Left(measure,20) 'cannot perform measure, please try a higher count'
|
|
return
|
|
|
|
Profiler:
|
|
arg ff,xx,yy,zz
|
|
rr=Profile(ff,xx,yy,zz)
|
|
say left(ff,10) 'takes' right(word(rr,2),4) 'microsec, x =' xx', f =' word(rr,1)/1
|
|
return
|
|
|
|
include Math
|