/usr/share/doc/regina-rexx/examples/rexxcps.rexx is in regina-rexx 3.6-2.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | /* ReXX */
/* Take a measure of REXX clauses-per-second (CPS) */
/* Mike Cowlishaw (mfc@ibm.com). Multi-platform. */
/* 1.0 17 Jan 89 Original version */
/* 2.0 3 Jun 89 Remove attempt to simulate commands */
/* 2.1 7 Oct 89 Remove use of not symbols, and correct commentary */
/* 2.2 31 Mar 00 Allow measures/iterations/tracevar to be passed on*/
/* command line. mhes */
rexxcps=2.2 /* REXXCPS version; quotable only if code unchanged */
/* This measure of REXX execution speed is based on an analysis of */
/* the dynamic mix of clauses found in a (subjectively chosen) */
/* collection of REXX programs (including commands, macros, and */
/* personal programs). Approximately 2,500,000 lines of trace */
/* output were analysed, and the program below recreates the */
/* dynamic mix of constructs found in that analysis. */
/* In view of the dramatic differences between systems in their */
/* efficiency of issuing commands, the timed loop does not issue */
/* commands (an 'RC=expression; PARSE' sequence is used instead). */
/* This program therefore measures the performance of a REXX */
/* implementation, exclusive of command execution overhead. */
/* Elapsed (user-perceived) time is used, rather than any form of */
/* virtual time. */
Parse Arg averaging count tracevar
if averaging = '' Then averaging = 10 /* Averaging-over count */
if count = '' Then count = 30 /* Repetition count */
if tracevar = '' then tracevar = 'Off' /* Trace setting (for development use) */
signal on novalue
parse source source 1 system .
parse version version
say '----- REXXCPS' rexxcps '-- Measuring REXX clauses/second -----'
say ' REXX version is:' version
say ' System is:' system
say ' Averaging:' averaging 'measures of' count 'iterations'
/* ----- Calibrate for the empty do-loop (average of 5) ----- */
empty=0
do i=1 to averaging
call time 'R'
do count; end
empty=time('R')+empty
end
empty=empty/averaging
noterm=(system='CMS'); if pos('O',tracevar)=1 then noterm=0
if noterm then do
say 'Calibration (empty DO):' empty 'secs (average of' averaging')'
say 'Spooling trace NOTERM'
'CP SPOOL CON * START NOTERM'; 'CP CLOSE CON PUR'
end
/* Now the true timer loop .. average timing again */
full=0
do i=1 to averaging
trace value tracevar
call time 'R'
do count;
/* ----- This is first of the 1000 clauses ----- */
flag=0; p0='b'
do loop=1 to 14
/* This is the "block" comment in loop */
key1='Key Bee'
acompound.key1.loop=substr(1234"5678",6,2)
if flag=acompound.key1.loop then say 'Failed1'
do j=1.1 to 2.2 by 1.1 /* executed 28 times */
if j>acompound.key1.loop then say 'Failed2'
if 17<length(j)-1 then say 'Failed3'
if j='foobar' then say 'Failed4'
if substr(1234,1,1)=9 then say 'Failed5'
if word(key1,1)='?' then say 'Failed6'
if j<5 then do /* This path taken */
acompound.key1.loop=acompound.key1.loop+1
if j=2 then leave
end
iterate
end /* j */
avar.=1.0''loop
select
when flag='string' then say 'FailedS1'
when avar.flag.2=0 then say 'FailedS2'
when flag=5+99.7 then say 'FailedS3'
when flag then avar.1.2=avar.1.2*1.1
when flag==0 then flag=0
end
if 1 then flag=1
select
when flag=='ring' then say 'FailedT1'
when avar.flag.3=0 then say 'FailedT2'
when flag then avar.1.2=avar.1.2*1.1
when flag==0 then flag=1
end
parse value 'Foo Bar' with v1 +5 v2 .
trace value trace(); address value address()
call subroutine 'with' 2 'args', '(This is the second)'1''1
rc='This is an awfully boring program'; parse var rc p1 (p0) p5
rc='is an awfully boring program This'; parse var rc p2 (p0) p6
rc='an awfully boring program This is'; parse var rc p3 (p0) p7
rc='awfully boring program This is an'; parse var rc p4 (p0) p8
end loop
/* ----- This is last of the 1000 clauses ----- */
end
full=time('R')+full
trace off
end
full=full/averaging
if noterm then do
'CP CLOSE CON'; 'CP SPOOL CON * START TERM'
say 'Spooling now back on TERM'
end
/* Now display the statistics */
looptime=(full-empty)/count
/* Developer's statistics: */
if left(tracevar,1)='O' then nop; else do
say
say 'Total (full DO):' full-empty 'secs (average of' averaging ,
'measures of' count 'iterations)'
say 'Time for one iteration (1000 clauses) was:' looptime 'seconds'
end
/* And finally, the Result... */
if looptime = 0 Then do
say ' The granularity of the system clock appears to be too coarse to'
say ' obtain an effective result. Re-run this progam and increase the'
say ' number of iterations or the repeat count.'
end
else do
say
say' Performance:' format(1000/looptime,,0) 'REXX clauses per second'
say
end
exit
/* Target routine for the timed CALL - called 14 times */
subroutine:
parse upper arg a1 a2 a3 ., a4
parse var a3 b1 b2 b3 .
do 1; rc=a1 a2 a3; parse var rc c1 c2 c3; end
return
novalue: if noterm then 'CP SP CON STOP TERM'
say 'novalue triggered'
/* -- end of program -- */
|