Optimizer Usage Examples

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:


Example 1 - No Improvement

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

Example 2 - Considerable Improvement

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='

Examples 3 and 4 - CPU Usage

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