The examples below illustrate when to use the Natural Optimizer Compiler to the best advantage and to give an indication of its power:
This document covers the following topics:
Nothing would be gained by using the Natural Optimizer Compiler for the following program, since it contains a statement that performs database access and an I/O statement (see Statements that are Not Compiled):
DEFINE DATA LOCAL 1 EMPLOYEES VIEW OF EMPLOYEES 2 JOB-TITLE 2 BIRTH 2 NAME END-DEFINE FIND EMPLOYEES WITH JOB-TITLE = 'PROGRAMMER' OR = 'ANALYST' OR = 'PROGRAMMER/ANALYST' OR = 'SYSTEM ANALYST' DISPLAY JOB-TITLE BIRTH NAME END-FIND END
If the following program is compiled with the Natural Optimizer Compiler, you will see a performance improvement of approximately 30 % (that is a 30 % reduction in CPU load). The program performs a statistical analysis of the age of IT-employees. Optimized statements are indicated in boldface.
In this example, the Natural Optimizer Compiler increases the object size by 20.5 %, due to 952 bytes of additional machine code:
Profile Parameter Setting | Size in Buffer Pool | Size of Machine Code Generated by NOC |
---|---|---|
OPT=NODBG |
5768 | 952 |
OPT=OFF |
4784 | 0 |
DEFINE DATA LOCAL 1 EMPLOY VIEW OF EMPLOYEES 2 JOB-TITLE (A25) 2 BIRTH (D) 1 I (I1) INIT <1> 1 CDATE (D) 1 NUMB (N4) 1 SUMM (P7.2) 1 SQUARE (F8) 1 DEVI (F8) 1 DEVIATION (N3.4) 1 MEAN (P2.3) 1 AGEDIS (F8/1:70) 1 AGEMAX (F8) 1 AGEH (P3) 1 AGE (P3) 1 AGEDAYS (P15) 1 LINE (A71/1:20) 1 REDEFINE LINE 2 POINTS (A1/1:20,0:70) END-DEFINE * MOVE *DATX TO CDATE * FIND EMPLOY WITH JOB-TITLE = 'PROGRAMMER' OR = 'ANALYST' OR = 'PROGRAMMER/ANALYST' OR = 'SYSTEM ANALYST' AGEDAYS:= CDATE - BIRTH AGE:=AGEDAYS / 365 ADD 1 TO AGEDIS(AGE) /* DISTRIBUTION ADD 1 TO NUMB ADD AGE TO SUMM COMPUTE SQUARE = SQUARE + AGE * AGE END-FIND * ***************************************************************** * COMPUTE ESTIMATES ***************************************************************** * COMPUTE DEVI = NUMB * SQUARE / (SUMM * SUMM) - 1 COMPUTE DEVIATION = SQRT(DEVI) COMPUTE MEAN = SUMM / NUMB * ***************************************************************** * GRAPHIC DISPLAY ***************************************************************** * FOR I 1 70 IF AGEDIS(I) > AGEMAX MOVE AGEDIS(I) TO AGEMAX END-IF END-FOR FOR I 1 70 COMPUTE AGEDIS(I) = AGEDIS(I) * 20 / AGEMAX END-FOR FOR I 1 70 COMPUTE AGEH = 21 - AGEDIS(I) IF AGEH < 21 MOVE '*' TO POINTS(AGEH:20,I) END-IF END-FOR * ***************************************************************** * COMPLETE GRAPHIC DISPLAY ***************************************************************** * MOVE '!' TO POINTS(*,0) WRITE TITLE LEFT AGEMAX(EM=999) 20X 'DISTRIBUTION OF IT-EMPLOYEES BY AGE' WRITE NOTITLE NOHDR LINE(*) / '0--------10--------20--------30--------40--------50--------60--------' / 'MEAN='
The following program illustrates the difference in CPU usage, depending on the options you select when compiling the program. The table below lists the CPU usage in seconds and percent. The figures provided in the table were determined during a test run in an IBM z/OS environment. They can only serve as general orientation, since absolute values vary depending on the hardware applied.
DEFINE DATA LOCAL 1 #I1 (I4) INIT <1> 1 #I2 (I4) INIT <2> 1 #J1 (I4) INIT <3> 1 #J2 (I4) INIT <4> 1 #F (I4) 1 #ARR1 (N7/10,5) 1 #ARR2 (N5/10,5) END-DEFINE * FOR #F = 1 TO 1000000 MOVE #ARR1(#I1,#I2) TO #ARR2(#J1,#J2) END-FOR * END
Option | CPU seconds | CPU percentage |
---|---|---|
OFF |
8.78 | 100 |
ON |
0.63 | 7.18 |
INDX |
0.85 | 9.68 |
OVFLW |
1.71 | 19.48 |
INDX,OVFLW |
2.00 | 22.78 |
INDX,OVFLW,NODBG |
1.61 | 18.34 |
INDX,OVFLW,NODBG,NOSGNTR |
1.61 | 18.34 |
NODBG |
0.44 | 5.01 |
NOSGNTR |
0.63 | 7.18 |
NODBG,NOSGNTR |
0.44 | 5.01 |
DEFINE DATA LOCAL 1 #I1 (P7) INIT <1> 1 #I2 (P7) INIT <2> 1 #J1 (N7) INIT <3> 1 #J2 (N7) INIT <4> 1 #K1 (I4) INIT <5> 1 #K2 (I4) INIT <6> 1 #F (I4) 1 #FIELD1 (P5) 1 #FIELD2 (N5) 1 #FIELD3 (I2) END-DEFINE * FOR #F = 1 TO 500000 * #FIELD1:= #I1 - #I2 + (13 * 10 / 5) #FIELD2:= #J1 - #J2 + (13 * 10 / 5) #FIELD3:= #K1 - #K2 + (13 * 10 / 5) * END-FOR * END
Option | CPU seconds | CPU percentage |
---|---|---|
OFF |
18.61 | 100.00 |
ON |
4.95 | 26.60 |
INDX |
4.95 | 26.60 |
OVFLW |
5.38 | 28.91 |
INDX,OVFLW |
5.38 | 28.91 |
INDX,OVFLW,NODBG |
5.26 | 28.26 |
INDX,OVFLW,NODBG,NOSGNTR |
5.09 | 27.35 |
NODBG |
4.79 | 25.74 |
NOSGNTR |
4.81 | 25.85 |
NODBG,NOSGNTR |
4.63 | 24.88 |
NODBG,NOSGNTR,ZD=OFF |
4.51 | 24.23 |
NODBG,NOSGNTR,ZD=OFF,SIGNCHCK=OFF |
4.41 | 23.70 |