🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: bit.listserv.tsorexx
2 messages
2 total messages Started by Robert Zenuk Tue, 12 Mar 2013 16:33
REXX performance Testing
#272
Author: Robert Zenuk
Date: Tue, 12 Mar 2013 16:33
175 lines
11269 bytes
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 LISTSERV@VM.MARIST.EDU with the message: INFO TSO-REXX
Re: REXX performance Testing
#274
Author: George, William
Date: Tue, 12 Mar 2013 16:45
244 lines
12009 bytes
Thanks Rob!!


-----Original Message-----
From: TSO REXX Discussion List [mailto:TSO-REXX@VM.MARIST.EDU] On Behalf
Of Robert Zenuk
Sent: Tuesday, March 12, 2013 9:33 AM
To: TSO-REXX@VM.MARIST.EDU
Subject: [TSO-REXX] REXX performance Testing

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 LISTSERV@VM.MARIST.EDU with the message: INFO TSO-REXX

______________________________________________________________________
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.

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

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads