Optimizer Usage Examples

#### Search Results

Search

# 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

- Example 2 - Considerable Improvement

- Examples 3 and 4 - CPU Usage

## 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

### On this page

- Example 1 - No Improvement
- Example 2 - Considerable Improvement
- Examples 3 and 4 - CPU Usage