Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

REXX performance Testing

62 views
Skip to first unread message

Robert Zenuk

unread,
Mar 12, 2013, 12:33:57 PM3/12/13
to
Based on the intent of the recent "Tuning" thread I just did some actual performance testing to compare different techniques for a project I'm working on and wanted to share. Having heard some axioms for years and never doing my own testing to see real numbers I was curious if different approaches to string handling, parsing and built-in function nesting would make a noticeable difference. So, I constructed a couple tests and measured the results. I am not going to test everything nor am I willing to try additional testing for everyone's curiosity since I do have a project with a deadline. I am willing to post what I did (the test code and the JCL). This should be enough for others to replicate the approach for their own curiosity. Hopefully others will share their results too if more testing is done.

My first test was to compare the SUBSTR, LEFT and PARSE approaches to pull off the first character of a string. This is something that will occur in my project millions of times.

Here are my 3 test EXECs.

/* REXX - TESTSTR1 */
arg loops
string = '1abcde'
do loops
if substr(string,1,1) = '1' then nop
end

/* REXX - TESTSTR2 */
arg loops
string = '1abcde'
do loops
if left(string,1) = '1' then nop
end

/* REXX - TESTSTR3 */
arg loops
string = '1abcde'
do loops
parse var string 1 x 2 rest
if x = '1' then nop
end

Here is my test JCL

//jobcard...
//***************************************************************
//* TSO BATCH JOB *
//***************************************************************
//SYSEXEC PROC LOOPS=1,PROG=TESTSTR1
//TESTREXX EXEC PGM=IKJEFT01,PARM='&PROG &LOOPS'
//SYSEXEC DD DSN=MY.EXEC,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
// PEND
//***************************************************************
//* SYSEXEC TIMINGS *
//***************************************************************
//TS10001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR1
//TS10010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR1
//TS10100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR1
//TS11K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR1
//TS110K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR1
//TS1100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR1
//TS11M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR1
//***************************************************************
//TS20001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR2
//TS20010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR2
//TS20100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR2
//TS21K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR2
//TS210K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR2
//TS2100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR2
//TS21M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR2
//***************************************************************
//TS30001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR3
//TS30010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR3
//TS30100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR3
//TS31K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR3
//TS310K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR3
//TS3100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR3
//TS31M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR3

Here are my results

STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
TS10001 TESTREXX IKJEFT01 00 41 .01 .00 .24 709
TS10010 TESTREXX IKJEFT01 00 43 .01 .00 .05 587
TS10100 TESTREXX IKJEFT01 00 41 .01 .00 .07 627
TS11K TESTREXX IKJEFT01 00 45 .01 .00 .07 590
TS110K TESTREXX IKJEFT01 00 42 .02 .00 .06 948
TS1100K TESTREXX IKJEFT01 00 42 .08 .00 .32 4045
TS11M TESTREXX IKJEFT01 00 44 .65 .00 1.30 34421
TS20001 TESTREXX IKJEFT01 00 44 .01 .00 .21 625
TS20010 TESTREXX IKJEFT01 00 42 .01 .00 .05 586
TS20100 TESTREXX IKJEFT01 00 42 .01 .00 .07 659
TS21K TESTREXX IKJEFT01 00 43 .01 .00 .06 750
TS210K TESTREXX IKJEFT01 00 44 .02 .00 .06 935
TS2100K TESTREXX IKJEFT01 00 46 .07 .00 .15 3614
TS21M TESTREXX IKJEFT01 00 45 .57 .00 .89 30311
TS30001 TESTREXX IKJEFT01 00 42 .01 .00 .10 704
TS30010 TESTREXX IKJEFT01 00 43 .01 .00 .10 585
TS30100 TESTREXX IKJEFT01 00 42 .01 .00 .05 530
TS31K TESTREXX IKJEFT01 00 44 .01 .00 .05 634
TS310K TESTREXX IKJEFT01 00 43 .02 .00 .11 957
TS3100K TESTREXX IKJEFT01 00 45 .08 .00 .17 4243
TS31M TESTREXX IKJEFT01 00 42 .70 .00 .98 37131

LEFT wins!

My second test was to further test the first character and see if it was numeric. I tested nesting built-in functions versus separate calls for each.

Here are my 2 EXECs

/* REXX - TESTNST1 */
arg loops
string = '1abcde'
do loops
first = left(string,1)
type = datatype(first)
if type = 'NUM' then nop
end

/* REXX - TESTNST2 */
arg loops
string = '1abcde'
do loops
if datatype(left(string,1)) = 'NUM' then nop
end

Here is my JCL

//jobcard...
//***************************************************************
//* TSO BATCH JOB *
//***************************************************************
//SYSEXEC PROC LOOPS=1,PROG=TESTNST1
//TESTREXX EXEC PGM=IKJEFT01,PARM='&PROG &LOOPS'
//SYSEXEC DD DSN=OPSROZ.EXEC,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
// PEND
//***************************************************************
//* SYSEXEC TIMINGS *
//***************************************************************
//TS10001 EXEC SYSEXEC,LOOPS=1,PROG=TESTNST1
//TS10010 EXEC SYSEXEC,LOOPS=10,PROG=TESTNST1
//TS10100 EXEC SYSEXEC,LOOPS=100,PROG=TESTNST1
//TS11K EXEC SYSEXEC,LOOPS=1000,PROG=TESTNST1
//TS110K EXEC SYSEXEC,LOOPS=10000,PROG=TESTNST1
//TS1100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTNST1
//TS11M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTNST1
//***************************************************************
//TS20001 EXEC SYSEXEC,LOOPS=1,PROG=TESTNST2
//TS20010 EXEC SYSEXEC,LOOPS=10,PROG=TESTNST2
//TS20100 EXEC SYSEXEC,LOOPS=100,PROG=TESTNST2
//TS21K EXEC SYSEXEC,LOOPS=1000,PROG=TESTNST2
//TS210K EXEC SYSEXEC,LOOPS=10000,PROG=TESTNST2
//TS2100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTNST2
//TS21M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTNST2

The results

STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
TS10001 TESTREXX IKJEFT01 00 17 .01 .00 .19 547
TS10010 TESTREXX IKJEFT01 00 18 .01 .00 .04 487
TS10100 TESTREXX IKJEFT01 00 17 .01 .00 .04 498
TS11K TESTREXX IKJEFT01 00 21 .01 .00 .11 581
TS110K TESTREXX IKJEFT01 00 18 .02 .00 .10 1151
TS1100K TESTREXX IKJEFT01 00 18 .12 .00 .20 6367
TS11M TESTREXX IKJEFT01 00 18 1.11 .00 1.40 58870
TS20001 TESTREXX IKJEFT01 00 18 .01 .00 .08 537
TS20010 TESTREXX IKJEFT01 00 18 .01 .00 .09 515
TS20100 TESTREXX IKJEFT01 00 18 .01 .00 .13 533
TS21K TESTREXX IKJEFT01 00 18 .01 .00 .06 579
TS210K TESTREXX IKJEFT01 00 18 .02 .00 .04 901
TS2100K TESTREXX IKJEFT01 00 21 .08 .00 .23 4490
TS21M TESTREXX IKJEFT01 00 18 .76 .00 1.15 40075

Nesting wins!

Rob






----------------------------------------------------------------------
For TSO-REXX subscribe / signoff / archive access instructions,
send email to LIST...@VM.MARIST.EDU with the message: INFO TSO-REXX

George, William@FTB

unread,
Mar 12, 2013, 12:45:28 PM3/12/13
to
Thanks Rob!!
______________________________________________________________________
CONFIDENTIALITY NOTICE: This email from the State of California is for the sole use of the intended recipient and may contain confidential and privileged information. Any unauthorized review or use, including disclosure or distribution, is prohibited. If you are not the intended recipient, please contact the sender and destroy all copies of this email.

Robert AH Prins

unread,
Mar 12, 2013, 4:13:12 PM3/12/13
to
On 2013-03-12 16:33, Robert Zenuk wrote:
> Based on the intent of the recent "Tuning" thread I just did some actual performance testing to compare different techniques for a project I'm working on and wanted to share. Having heard some axioms for years and never doing my own testing to see real numbers I was curious if different approaches to string handling, parsing and built-in function nesting would make a noticeable difference. So, I constructed a couple tests and measured the results. I am not going to test everything nor am I willing to try additional testing for everyone's curiosity since I do have a project with a deadline. I am willing to post what I did (the test code and the JCL). This should be enough for others to replicate the approach for their own curiosity. Hopefully others will share their results too if more testing is done.
>
> My first test was to compare the SUBSTR, LEFT and PARSE approaches to pull off the first character of a string. This is something that will occur in my project millions of times.
>
> /* REXX - TESTSTR3 */
> arg loops
> string = '1abcde'
> do loops
> parse var string 1 x 2 rest
> if x = '1' then nop
> end

And who wins if you replace the above parse with

parse var string 1 x 2 .

After all, why do an assignment if you don't use the assigned value?

Robert
--
Robert AH Prins
robert(a)prino(d)org

Höglund Lars

unread,
Mar 13, 2013, 2:30:23 AM3/13/13
to
Append a new one, TESTSTR4

/* REXX - TESTSTR4 */
arg loops
string = '1abcde'
do loops
if abbrev(string,'1') then nop
end

//Lasse

-----Ursprungligt meddelande-----
Fr�n: TSO REXX Discussion List [mailto:TSO-...@VM.MARIST.EDU] F�r Robert Zenuk
Skickat: den 12 mars 2013 17:35
Till: TSO-...@VM.MARIST.EDU
�mne: [TSO-REXX] REXX performance Testing

Robert Zenuk

unread,
Mar 13, 2013, 10:43:19 AM3/13/13
to
White smoke... We have a new winner!

STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
TS10001 TESTREXX IKJEFT01 00 18 .01 .00 .06 518
TS10010 TESTREXX IKJEFT01 00 19 .01 .00 .03 517
TS10100 TESTREXX IKJEFT01 00 18 .01 .00 .04 537
TS11K TESTREXX IKJEFT01 00 22 .01 .00 .04 572
TS110K TESTREXX IKJEFT01 00 19 .02 .00 .04 859
TS1100K TESTREXX IKJEFT01 00 19 .07 .00 .11 3891
TS11M TESTREXX IKJEFT01 00 19 .64 .00 .94 33959
TS20001 TESTREXX IKJEFT01 00 19 .01 .00 .14 556
TS20010 TESTREXX IKJEFT01 00 19 .01 .00 .03 495
TS20100 TESTREXX IKJEFT01 00 19 .01 .00 .03 519
TS21K TESTREXX IKJEFT01 00 19 .01 .00 .03 550
TS210K TESTREXX IKJEFT01 00 19 .02 .00 .06 837
TS2100K TESTREXX IKJEFT01 00 22 .07 .00 .10 3461
TS21M TESTREXX IKJEFT01 00 19 .57 .00 .69 29987
TS30001 TESTREXX IKJEFT01 00 19 .01 .00 .03 538
TS30010 TESTREXX IKJEFT01 00 19 .01 .00 .03 495
TS30100 TESTREXX IKJEFT01 00 19 .01 .00 .05 507
TS31K TESTREXX IKJEFT01 00 19 .01 .00 .04 591
TS310K TESTREXX IKJEFT01 00 19 .02 .00 .05 886
TS3100K TESTREXX IKJEFT01 00 19 .08 .00 .12 4190
TS31M TESTREXX IKJEFT01 00 22 .70 .00 .85 36875
TS40001 TESTREXX IKJEFT01 00 19 .01 .00 .03 549
TS40010 TESTREXX IKJEFT01 00 19 .01 .00 .03 524
TS40100 TESTREXX IKJEFT01 00 19 .01 .00 .04 598
TS41K TESTREXX IKJEFT01 00 19 .01 .00 .03 594
TS410K TESTREXX IKJEFT01 00 19 .02 .00 .07 813
TS4100K TESTREXX IKJEFT01 00 19 .05 .00 .08 2893
TS41M TESTREXX IKJEFT01 00 19 .44 .00 .55 23293

Thanks,

Rob



-----Original Message-----
From: Höglund Lars <Lars.H...@ALECTA.SE>
To: TSO-REXX <TSO-...@VM.MARIST.EDU>
Sent: Tue, Mar 12, 2013 11:30 pm
Subject: SV: [TSO-REXX] REXX performance Testing


Append a new one, TESTSTR4
/* REXX - TESTSTR4 */
rg loops
tring = '1abcde'
o loops
if abbrev(string,'1') then nop
nd
//Lasse
-----Ursprungligt meddelande-----
rån: TSO REXX Discussion List [mailto:TSO-...@VM.MARIST.EDU] För Robert Zenuk
kickat: den 12 mars 2013 17:35
ill: TSO-...@VM.MARIST.EDU
mne: [TSO-REXX] REXX performance Testing
Based on the intent of the recent "Tuning" thread I just did some actual
erformance testing to compare different techniques for a project I'm working on
nd wanted to share. Having heard some axioms for years and never doing my own
esting to see real numbers I was curious if different approaches to string
andling, parsing and built-in function nesting would make a noticeable
ifference. So, I constructed a couple tests and measured the results. I am
ot going to test everything nor am I willing to try additional testing for
veryone's curiosity since I do have a project with a deadline. I am willing to
ost what I did (the test code and the JCL). This should be enough for others
o replicate the approach for their own curiosity. Hopefully others will share
heir results too if more testing is done.
My first test was to compare the SUBSTR, LEFT and PARSE approaches to pull off
he first character of a string. This is something that will occur in my
roject millions of times.
Here are my 3 test EXECs.
/* REXX - TESTSTR1 */
rg loops
tring = '1abcde'
o loops
if substr(string,1,1) = '1' then nop
nd
/* REXX - TESTSTR2 */
rg loops
tring = '1abcde'
o loops
if left(string,1) = '1' then nop
nd
/* REXX - TESTSTR3 */
rg loops
tring = '1abcde'
o loops
parse var string 1 x 2 rest
if x = '1' then nop
nd
Here is my test JCL
//jobcard...
/***************************************************************
/* TSO BATCH JOB *
/***************************************************************
/SYSEXEC PROC LOOPS=1,PROG=TESTSTR1
/TESTREXX EXEC PGM=IKJEFT01,PARM='&PROG &LOOPS'
/SYSEXEC DD DSN=MY.EXEC,DISP=SHR
/SYSTSPRT DD SYSOUT=*
/SYSTSIN DD DUMMY
/ PEND
/***************************************************************
/* SYSEXEC TIMINGS *
/***************************************************************
/TS10001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR1
/TS10010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR1
/TS10100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR1
/TS11K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR1
/TS110K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR1
/TS1100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR1
/TS11M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR1
/***************************************************************
/TS20001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR2
/TS20010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR2
/TS20100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR2
/TS21K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR2
/TS210K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR2
/TS2100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR2
/TS21M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR2
/***************************************************************
/TS30001 EXEC SYSEXEC,LOOPS=1,PROG=TESTSTR3
/TS30010 EXEC SYSEXEC,LOOPS=10,PROG=TESTSTR3
/TS30100 EXEC SYSEXEC,LOOPS=100,PROG=TESTSTR3
/TS31K EXEC SYSEXEC,LOOPS=1000,PROG=TESTSTR3
/TS310K EXEC SYSEXEC,LOOPS=10000,PROG=TESTSTR3
/TS3100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTSTR3
/TS31M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTSTR3
Here are my results
STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
S10001 TESTREXX IKJEFT01 00 41 .01 .00 .24 709
S10010 TESTREXX IKJEFT01 00 43 .01 .00 .05 587
S10100 TESTREXX IKJEFT01 00 41 .01 .00 .07 627
S11K TESTREXX IKJEFT01 00 45 .01 .00 .07 590
S110K TESTREXX IKJEFT01 00 42 .02 .00 .06 948
S1100K TESTREXX IKJEFT01 00 42 .08 .00 .32 4045
S11M TESTREXX IKJEFT01 00 44 .65 .00 1.30 34421
S20001 TESTREXX IKJEFT01 00 44 .01 .00 .21 625
S20010 TESTREXX IKJEFT01 00 42 .01 .00 .05 586
S20100 TESTREXX IKJEFT01 00 42 .01 .00 .07 659
S21K TESTREXX IKJEFT01 00 43 .01 .00 .06 750
S210K TESTREXX IKJEFT01 00 44 .02 .00 .06 935
S2100K TESTREXX IKJEFT01 00 46 .07 .00 .15 3614
S21M TESTREXX IKJEFT01 00 45 .57 .00 .89 30311
S30001 TESTREXX IKJEFT01 00 42 .01 .00 .10 704
S30010 TESTREXX IKJEFT01 00 43 .01 .00 .10 585
S30100 TESTREXX IKJEFT01 00 42 .01 .00 .05 530
S31K TESTREXX IKJEFT01 00 44 .01 .00 .05 634
S310K TESTREXX IKJEFT01 00 43 .02 .00 .11 957
S3100K TESTREXX IKJEFT01 00 45 .08 .00 .17 4243
S31M TESTREXX IKJEFT01 00 42 .70 .00 .98 37131
LEFT wins!
My second test was to further test the first character and see if it was
umeric. I tested nesting built-in functions versus separate calls for each.
Here are my 2 EXECs
/* REXX - TESTNST1 */
rg loops
tring = '1abcde'
o loops
first = left(string,1)
type = datatype(first)
if type = 'NUM' then nop
nd
/* REXX - TESTNST2 */
rg loops
tring = '1abcde'
o loops
if datatype(left(string,1)) = 'NUM' then nop
nd
Here is my JCL
//jobcard...
/***************************************************************
/* TSO BATCH JOB *
/***************************************************************
/SYSEXEC PROC LOOPS=1,PROG=TESTNST1
/TESTREXX EXEC PGM=IKJEFT01,PARM='&PROG &LOOPS'
/SYSEXEC DD DSN=OPSROZ.EXEC,DISP=SHR
/SYSTSPRT DD SYSOUT=*
/SYSTSIN DD DUMMY
/ PEND
/***************************************************************
/* SYSEXEC TIMINGS *
/***************************************************************
/TS10001 EXEC SYSEXEC,LOOPS=1,PROG=TESTNST1
/TS10010 EXEC SYSEXEC,LOOPS=10,PROG=TESTNST1
/TS10100 EXEC SYSEXEC,LOOPS=100,PROG=TESTNST1
/TS11K EXEC SYSEXEC,LOOPS=1000,PROG=TESTNST1
/TS110K EXEC SYSEXEC,LOOPS=10000,PROG=TESTNST1
/TS1100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTNST1
/TS11M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTNST1
/***************************************************************
/TS20001 EXEC SYSEXEC,LOOPS=1,PROG=TESTNST2
/TS20010 EXEC SYSEXEC,LOOPS=10,PROG=TESTNST2
/TS20100 EXEC SYSEXEC,LOOPS=100,PROG=TESTNST2
/TS21K EXEC SYSEXEC,LOOPS=1000,PROG=TESTNST2
/TS210K EXEC SYSEXEC,LOOPS=10000,PROG=TESTNST2
/TS2100K EXEC SYSEXEC,LOOPS=100000,PROG=TESTNST2
/TS21M EXEC SYSEXEC,LOOPS=1000000,PROG=TESTNST2
The results
STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
S10001 TESTREXX IKJEFT01 00 17 .01 .00 .19 547
S10010 TESTREXX IKJEFT01 00 18 .01 .00 .04 487
S10100 TESTREXX IKJEFT01 00 17 .01 .00 .04 498
S11K TESTREXX IKJEFT01 00 21 .01 .00 .11 581
S110K TESTREXX IKJEFT01 00 18 .02 .00 .10 1151
S1100K TESTREXX IKJEFT01 00 18 .12 .00 .20 6367
S11M TESTREXX IKJEFT01 00 18 1.11 .00 1.40 58870
S20001 TESTREXX IKJEFT01 00 18 .01 .00 .08 537
S20010 TESTREXX IKJEFT01 00 18 .01 .00 .09 515
S20100 TESTREXX IKJEFT01 00 18 .01 .00 .13 533
S21K TESTREXX IKJEFT01 00 18 .01 .00 .06 579
S210K TESTREXX IKJEFT01 00 18 .02 .00 .04 901
S2100K TESTREXX IKJEFT01 00 21 .08 .00 .23 4490
S21M TESTREXX IKJEFT01 00 18 .76 .00 1.15 40075
Nesting wins!
Rob



---------------------------------------------------------------------
or TSO-REXX subscribe / signoff / archive access instructions, send email to
IST...@VM.MARIST.EDU with the message: INFO TSO-REXX
----------------------------------------------------------------------
or TSO-REXX subscribe / signoff / archive access instructions,

Paul Gilmartin

unread,
Mar 13, 2013, 1:26:44 PM3/13/13
to
On Mar 13, 2013, at 08:43, Robert Zenuk wrote:

> White smoke... We have a new winner!
>
I rewrote this as a single EXEC, to circumvent job step overhead
(and to format the results more nicely). I used single-letter
variable names because some believe these are handled more efficiently
by the interpreter. I always used simple assignments rather than IF.
The EXEC:

/* REXX - rexxperf
Doc: various Rexx performance evaluations.
*/
S = '1abcde'
do I = 1 to 4
P = 'TESTSTR'I
say
say '=====' P '====='
do J = 1 to 7
Reps = left( 1000000000, J )
call time 'R'
interpret 'call' P Reps
say P right( Reps, 8 ) 'Reps Time =' time( 'E' )
end J
end I
return( 0 )

TESTSTR1:
L = arg( 1 )
do L
X = substr(S,1,1) = '1'
end
return

TESTSTR2:
L = arg( 1 )
do L
X = left(S,1)
end
return

TESTSTR3:
L = arg( 1 )
do L
parse var S 1 x 2
end
return

TESTSTR4:
L = arg( 1 )
do L
X = abbrev(S,'1')
end
return

The output:

===== TESTSTR1 =====
TESTSTR1 1 Reps Time = 0.000148
TESTSTR1 10 Reps Time = 0.000168
TESTSTR1 100 Reps Time = 0.000981
TESTSTR1 1000 Reps Time = 0.006902
TESTSTR1 10000 Reps Time = 0.076849
TESTSTR1 100000 Reps Time = 0.642483
TESTSTR1 1000000 Reps Time = 6.584209

===== TESTSTR2 =====
TESTSTR2 1 Reps Time = 0.000189
TESTSTR2 10 Reps Time = 0.000151
TESTSTR2 100 Reps Time = 0.000516
TESTSTR2 1000 Reps Time = 0.004453
TESTSTR2 10000 Reps Time = 0.043908
TESTSTR2 100000 Reps Time = 0.413151
TESTSTR2 1000000 Reps Time = 4.242181

===== TESTSTR3 =====
TESTSTR3 1 Reps Time = 0.000116
TESTSTR3 10 Reps Time = 0.000116
TESTSTR3 100 Reps Time = 0.000396
TESTSTR3 1000 Reps Time = 0.003413
TESTSTR3 10000 Reps Time = 0.032821
TESTSTR3 100000 Reps Time = 0.326999
TESTSTR3 1000000 Reps Time = 3.272788

===== TESTSTR4 =====
TESTSTR4 1 Reps Time = 0.000124
TESTSTR4 10 Reps Time = 0.000208
TESTSTR4 100 Reps Time = 0.000544
TESTSTR4 1000 Reps Time = 0.004141
TESTSTR4 10000 Reps Time = 0.040354
TESTSTR4 100000 Reps Time = 0.408825
TESTSTR4 1000000 Reps Time = 4.151141

-- gil

Brenton, Ren

unread,
Mar 13, 2013, 1:55:32 PM3/13/13
to
I ran Gils version, from TSO/ISPF, and received similar results, (although the machine that I'm on is apparently faster by a factor of 10), but the comparative results still indicate that PARSE is still the fastest:

===== TESTSTR1 =====
TESTSTR1 1 Reps Time = 0.000009
TESTSTR1 10 Reps Time = 0.000010
TESTSTR1 100 Reps Time = 0.000054
TESTSTR1 1000 Reps Time = 0.001136
TESTSTR1 10000 Reps Time = 0.007763
TESTSTR1 100000 Reps Time = 0.052405
TESTSTR1 1000000 Reps Time = 0.681998

===== TESTSTR2 =====
TESTSTR2 1 Reps Time = 0.000009
TESTSTR2 10 Reps Time = 0.000009
TESTSTR2 100 Reps Time = 0.000038
TESTSTR2 1000 Reps Time = 0.000358
TESTSTR2 10000 Reps Time = 0.003798
TESTSTR2 100000 Reps Time = 0.052910
TESTSTR2 1000000 Reps Time = 0.493097

===== TESTSTR3 =====
TESTSTR3 1 Reps Time = 0.000009
TESTSTR3 10 Reps Time = 0.000007
TESTSTR3 100 Reps Time = 0.000029
TESTSTR3 1000 Reps Time = 0.000299
TESTSTR3 10000 Reps Time = 0.003229
TESTSTR3 100000 Reps Time = 0.035398
TESTSTR3 1000000 Reps Time = 0.341967

===== TESTSTR4 =====
TESTSTR4 1 Reps Time = 0.000010
TESTSTR4 10 Reps Time = 0.000009
TESTSTR4 100 Reps Time = 0.000036
TESTSTR4 1000 Reps Time = 0.000734
TESTSTR4 10000 Reps Time = 0.003675
TESTSTR4 100000 Reps Time = 0.035225
TESTSTR4 1000000 Reps Time = 0.415563

Ren
The information contained in this message is proprietary and/or confidential. If you are not the intended recipient, please: (i) delete the message and all copies; (ii) do not disclose, distribute or use the message in any manner; and (iii) notify the sender immediately. In addition, please be aware that any message addressed to our domain is subject to archiving and review by persons other than the intended recipient. Thank you.

Steve Comstock

unread,
Mar 13, 2013, 2:18:27 PM3/13/13
to
On 3/13/2013 11:55 AM, Brenton, Ren wrote:
> I ran Gils version, from TSO/ISPF, and received similar results,
> (although the machine that I'm on is apparently faster by a factor of 10),

[that's ironic; I hadn't heard of lpsvcs before so I went to your
website and that was the slowest loading page I've seen in a long
time; of course, you're probably not hosting your corporate web
site on your mainframe (although you could, of course)]
Kind regards,

-Steve Comstock
The Trainer's Friend, Inc.

303-355-2752
http://www.trainersfriend.com

* To get a good Return on your Investment, first make an investment!
+ Training your people is an excellent investment

* Try our tool for calculating your Return On Investment
for training dollars at
http://www.trainersfriend.com/ROI/roi.html

Grinsell, Don

unread,
Mar 13, 2013, 2:25:53 PM3/13/13
to
Methinks he should suggest that.

--

Donald Grinsell
State of Montana
406-444-2983
dgri...@mt.gov

Never give in, never, never, never, in nothing great or small, large or petty, never give in except to convictions of honour and good sense.

-----Original Message-----
From: TSO REXX Discussion List [mailto:TSO-...@VM.MARIST.EDU] On Behalf Of Steve Comstock
Sent: Wednesday, 13 March 2013 12:18
To: TSO-...@VM.MARIST.EDU
Subject: Re: [TSO-REXX] SV: [TSO-REXX] REXX performance Testing

On 3/13/2013 11:55 AM, Brenton, Ren wrote:
> I ran Gils version, from TSO/ISPF, and received similar results,
> (although the machine that I'm on is apparently faster by a factor of
> 10),

[that's ironic; I hadn't heard of lpsvcs before so I went to your
website and that was the slowest loading page I've seen in a long
time; of course, you're probably not hosting your corporate web
site on your mainframe (although you could, of course)]

Brenton, Ren

unread,
Mar 13, 2013, 2:36:37 PM3/13/13
to
Ha, that is ironic. Shoe makers children ....

I'm just a mainframer, and know nuthin bout hosting no web servers (sic).

I did however, run the EXEC again on our production box, (as opposed to the development box), and received slightly faster results, but comparatively PARSE still wins:

===== TESTSTR1 =====
TESTSTR1 1 Reps Time = 0.000010
TESTSTR1 10 Reps Time = 0.000012
TESTSTR1 100 Reps Time = 0.000051
TESTSTR1 1000 Reps Time = 0.000574
TESTSTR1 10000 Reps Time = 0.004131
TESTSTR1 100000 Reps Time = 0.042704
TESTSTR1 1000000 Reps Time = 0.499839

===== TESTSTR2 =====
TESTSTR2 1 Reps Time = 0.000009
TESTSTR2 10 Reps Time = 0.000009
TESTSTR2 100 Reps Time = 0.000038
TESTSTR2 1000 Reps Time = 0.001913
TESTSTR2 10000 Reps Time = 0.006273
TESTSTR2 100000 Reps Time = 0.044291
TESTSTR2 1000000 Reps Time = 0.380463

===== TESTSTR3 =====
TESTSTR3 1 Reps Time = 0.000008
TESTSTR3 10 Reps Time = 0.000008
TESTSTR3 100 Reps Time = 0.000029
TESTSTR3 1000 Reps Time = 0.000264
TESTSTR3 10000 Reps Time = 0.002712
TESTSTR3 100000 Reps Time = 0.032302
TESTSTR3 1000000 Reps Time = 0.247767

===== TESTSTR4 =====
TESTSTR4 1 Reps Time = 0.000008
TESTSTR4 10 Reps Time = 0.000009
TESTSTR4 100 Reps Time = 0.000037
TESTSTR4 1000 Reps Time = 0.000317
TESTSTR4 10000 Reps Time = 0.002963
TESTSTR4 100000 Reps Time = 0.029852
TESTSTR4 1000000 Reps Time = 0.291647
The information contained in this message is proprietary and/or confidential. If you are not the intended recipient, please: (i) delete the message and all copies; (ii) do not disclose, distribute or use the message in any manner; and (iii) notify the sender immediately. In addition, please be aware that any message addressed to our domain is subject to archiving and review by persons other than the intended recipient. Thank you.

Robert Zenuk

unread,
Mar 13, 2013, 3:40:08 PM3/13/13
to
Nice test harness Gil. The reason I like doing this in batch is avoiding the impact of TSO period 2, 3, etc for the higher rep tests. I also like the multiple step approach since I get CPU time and Wall Clock time (in addition to EXCP's, Service Units and Paging Stats - if we ever paged) for each test. I agree the 1 and 10 rep tests are not very useful.

I agree PARSE by itself is the fastest. If you do not need to immediately test the value, this is the best. However, if you need to test the value, you end up with 2 instructions versus 1, hence the extra time. In most of my code (and my current project) I will be testing the value after the parsing technique. This is where the value of nesting multiple functions on the same line comes in.

I rewrote the tests to include an assignment line and an IF test line to see the difference when an If is always needed. Tests 1-4 are the original tests. Test 5-8 are new versions that assign first, then test (always 2 lines in the loop). Test 3 and test 7 are identical since my parse example was already 2 lines in the loop.

Here are the results

STEPNAME PROCSTEP PROGRAM RC EXCP CPU SRB CLOCK SERV
TS10001 TESTREXX IKJEFT01 00 13 .01 .00 .09 529
TS10010 TESTREXX IKJEFT01 00 17 .01 .00 .07 552
TS10100 TESTREXX IKJEFT01 00 13 .01 .00 .03 507
TS11K TESTREXX IKJEFT01 00 14 .01 .00 .04 525
TS110K TESTREXX IKJEFT01 00 14 .02 .00 .06 838
TS1100K TESTREXX IKJEFT01 00 14 .07 .00 .12 3878
TS11M TESTREXX IKJEFT01 00 14 .64 .00 .83 33972
TS20001 TESTREXX IKJEFT01 00 14 .01 .00 .06 516
TS20010 TESTREXX IKJEFT01 00 14 .01 .00 .04 565
TS20100 TESTREXX IKJEFT01 00 14 .01 .00 .04 526
TS21K TESTREXX IKJEFT01 00 17 .01 .00 .03 559
TS210K TESTREXX IKJEFT01 00 14 .02 .00 .04 813
TS2100K TESTREXX IKJEFT01 00 14 .07 .00 .10 3506
TS21M TESTREXX IKJEFT01 00 14 .57 .00 .78 29951
TS30001 TESTREXX IKJEFT01 00 14 .01 .00 .03 492
TS30010 TESTREXX IKJEFT01 00 14 .01 .00 .03 508
TS30100 TESTREXX IKJEFT01 00 14 .01 .00 .03 493
TS31K TESTREXX IKJEFT01 00 14 .01 .00 .04 559
TS310K TESTREXX IKJEFT01 00 14 .02 .00 .05 880
TS3100K TESTREXX IKJEFT01 00 14 .08 .00 .12 4128
TS31M TESTREXX IKJEFT01 00 14 .69 .00 .84 36628
TS40001 TESTREXX IKJEFT01 00 14 .01 .00 .05 568
TS40010 TESTREXX IKJEFT01 00 14 .01 .00 .04 771
TS40100 TESTREXX IKJEFT01 00 14 .01 .00 .03 529
TS41K TESTREXX IKJEFT01 00 14 .01 .00 .03 510
TS410K TESTREXX IKJEFT01 00 14 .01 .00 .05 777
TS4100K TESTREXX IKJEFT01 00 14 .05 .00 .08 2820
TS41M TESTREXX IKJEFT01 00 14 .44 .00 .51 23235
TS50001 TESTREXX IKJEFT01 00 16 .01 .00 .05 479
TS50010 TESTREXX IKJEFT01 00 14 .01 .00 .04 504
TS50100 TESTREXX IKJEFT01 00 14 .01 .00 .06 565
TS51K TESTREXX IKJEFT01 00 14 .01 .00 .04 563
TS510K TESTREXX IKJEFT01 00 14 .02 .00 .04 950
TS5100K TESTREXX IKJEFT01 00 14 .09 .00 .15 4671
TS51M TESTREXX IKJEFT01 00 14 .80 .00 1.07 42151
TS60001 TESTREXX IKJEFT01 00 14 .01 .00 .05 573
TS60010 TESTREXX IKJEFT01 00 14 .01 .00 .04 532
TS60100 TESTREXX IKJEFT01 00 17 .01 .00 .05 568
TS61K TESTREXX IKJEFT01 00 14 .01 .00 .04 587
TS610K TESTREXX IKJEFT01 00 14 .02 .00 .05 936
TS6100K TESTREXX IKJEFT01 00 14 .08 .00 .16 4328
TS61M TESTREXX IKJEFT01 00 14 .73 .00 .88 38388
TS70001 TESTREXX IKJEFT01 00 14 .01 .00 .03 512
TS70010 TESTREXX IKJEFT01 00 14 .01 .00 .04 542
TS70100 TESTREXX IKJEFT01 00 14 .01 .00 .03 519
TS71K TESTREXX IKJEFT01 00 17 .01 .00 .03 577
TS710K TESTREXX IKJEFT01 00 14 .02 .00 .04 893
TS7100K TESTREXX IKJEFT01 00 14 .08 .00 .10 4162
TS71M TESTREXX IKJEFT01 00 14 .70 .00 .87 36785
TS80001 TESTREXX IKJEFT01 00 14 .01 .00 .04 573
TS80010 TESTREXX IKJEFT01 00 14 .01 .00 .03 547
TS80100 TESTREXX IKJEFT01 00 14 .01 .00 .03 530
TS81K TESTREXX IKJEFT01 00 14 .01 .00 .03 550
TS810K TESTREXX IKJEFT01 00 14 .02 .00 .04 842
TS8100K TESTREXX IKJEFT01 00 17 .07 .00 .10 3542
TS81M TESTREXX IKJEFT01 00 15 .58 .00 .67 30437

With 2 lines PARSE barely edges out LEFT, but ABBREV still wins.

/* REXX TESTSTR5 */
arg loops
string = '1abcde'
do loops
x = substr(string,1,1)
if x = '1' then nop
end

/* REXX TESTSTR6 */
arg loops
string = '1abcde'
do loops
x = left(string,1)
if x = '1' then nop
end

/* REXX TESTSTR7 */
arg loops
string = '1abcde'
do loops
parse var string 1 x 2 rest
if x = '1' then nop
end

/* REXX TESTSTR8 */
arg loops
string = '1abcde'
do loops
x = abbrev(string,'1')
if x then nop
end


Rob



-----Original Message-----
From: Brenton, Ren <Ren.B...@LPSVCS.COM>
To: TSO-REXX <TSO-...@VM.MARIST.EDU>
Sent: Wed, Mar 13, 2013 10:55 am
Subject: Re: SV: [TSO-REXX] REXX performance Testing


I ran Gils version, from TSO/ISPF, and received similar results, (although the
achine that I'm on is apparently faster by a factor of 10), but the comparative
----Original Message-----
rom: TSO REXX Discussion List [mailto:TSO-...@VM.MARIST.EDU] On Behalf Of Paul
ilmartin
ent: Wednesday, March 13, 2013 1:26 PM
o: TSO-...@VM.MARIST.EDU
ubject: Re: [TSO-REXX] SV: [TSO-REXX] REXX performance Testing
On Mar 13, 2013, at 08:43, Robert Zenuk wrote:
> White smoke... We have a new winner!

rewrote this as a single EXEC, to circumvent job step overhead (and to format
he results more nicely). I used single-letter variable names because some
elieve these are handled more efficiently by the interpreter. I always used
imple assignments rather than IF.
he EXEC:
/* REXX - rexxperf
Doc: various Rexx performance evaluations.
/
= '1abcde'
o I = 1 to 4
P = 'TESTSTR'I
say
say '=====' P '====='
do J = 1 to 7
Reps = left( 1000000000, J )
call time 'R'
interpret 'call' P Reps
say P right( Reps, 8 ) 'Reps Time =' time( 'E' )
end J
end I
eturn( 0 )
TESTSTR1:
= arg( 1 )
o L
X = substr(S,1,1) = '1'
nd
eturn
TESTSTR2:
= arg( 1 )
o L
X = left(S,1)
nd
eturn
TESTSTR3:
= arg( 1 )
o L
parse var S 1 x 2
nd
eturn
TESTSTR4:
= arg( 1 )
o L
X = abbrev(S,'1')
nd
eturn
The output:
===== TESTSTR1 =====
ESTSTR1 1 Reps Time = 0.000148
ESTSTR1 10 Reps Time = 0.000168
ESTSTR1 100 Reps Time = 0.000981
ESTSTR1 1000 Reps Time = 0.006902
ESTSTR1 10000 Reps Time = 0.076849
ESTSTR1 100000 Reps Time = 0.642483
ESTSTR1 1000000 Reps Time = 6.584209
===== TESTSTR2 =====
ESTSTR2 1 Reps Time = 0.000189
ESTSTR2 10 Reps Time = 0.000151
ESTSTR2 100 Reps Time = 0.000516
ESTSTR2 1000 Reps Time = 0.004453
ESTSTR2 10000 Reps Time = 0.043908
ESTSTR2 100000 Reps Time = 0.413151
ESTSTR2 1000000 Reps Time = 4.242181
===== TESTSTR3 =====
ESTSTR3 1 Reps Time = 0.000116
ESTSTR3 10 Reps Time = 0.000116
ESTSTR3 100 Reps Time = 0.000396
ESTSTR3 1000 Reps Time = 0.003413
ESTSTR3 10000 Reps Time = 0.032821
ESTSTR3 100000 Reps Time = 0.326999
ESTSTR3 1000000 Reps Time = 3.272788
===== TESTSTR4 =====
ESTSTR4 1 Reps Time = 0.000124
ESTSTR4 10 Reps Time = 0.000208
ESTSTR4 100 Reps Time = 0.000544
ESTSTR4 1000 Reps Time = 0.004141
ESTSTR4 10000 Reps Time = 0.040354
ESTSTR4 100000 Reps Time = 0.408825
ESTSTR4 1000000 Reps Time = 4.151141
-- gil
----------------------------------------------------------------------
or TSO-REXX subscribe / signoff / archive access instructions, send email to
IST...@VM.MARIST.EDU with the message: INFO TSO-REXX
The information contained in this message is proprietary and/or confidential. If
ou are not the intended recipient, please: (i) delete the message and all
opies; (ii) do not disclose, distribute or use the message in any manner; and
iii) notify the sender immediately. In addition, please be aware that any
essage addressed to our domain is subject to archiving and review by persons
ther than the intended recipient. Thank you.
----------------------------------------------------------------------
or TSO-REXX subscribe / signoff / archive access instructions,

Fenner, Jim

unread,
Mar 13, 2013, 6:56:19 PM3/13/13
to
Thanks Gil !

Jim

ATO Canberra
-----Original Message-----
From: TSO REXX Discussion List [mailto:TSO-...@VM.MARIST.EDU] On Behalf
Of Paul Gilmartin
**********************************************************************
IMPORTANT
The information transmitted is for the use of the intended
recipient only and may contain confidential and/or legally
privileged material. Any review, re-transmission, disclosure,
dissemination or other use of, or taking of any action in
reliance upon, this information by persons or entities other
than the intended recipient is prohibited and may result in
severe penalties. If you have received this e-mail in error
please notify the Privacy Hotline of the Australian Taxation
Office, telephone 13 2869 and delete all copies of this
transmission together with any attachments.
**********************************************************************
0 new messages