Thread View: bit.listserv.tsorexx
2 messages
2 total messages
Started by Robert Zenuk
Tue, 12 Mar 2013 16:33
REXX performance Testing
Author: Robert Zenuk
Date: Tue, 12 Mar 2013 16:33
Date: Tue, 12 Mar 2013 16:33
175 lines
11269 bytes
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
Author: George, William
Date: Tue, 12 Mar 2013 16:45
Date: Tue, 12 Mar 2013 16:45
244 lines
12009 bytes
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