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 |