Die folgenden Beispiele zeigen, wann der Natural Optimizer Compiler am besten eingesetzt werden kann und geben Hinweise auf seine Leistungsfähigkeit:
Folgende Themen werden behandelt:
Es wäre nichts gewonnen, wenn Sie den Natural Optimizer Compiler für das folgende Programm benutzten, da es ein Statement, das einen Datenbankzugriff durchführt, und ein Ein-/Ausgabe-Statement enthält (siehe Statements die nicht kompiliert werden):
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
Wird das folgende Programm mit dem Natural Optimizer Compiler kompiliert, dann sieht man eine Leistungsverbesserung von ca. 30 % (das bedeutet eine Verringerung der CPU-Belastung um 30 %). Das gezeigte Beispiel-Programm führt eine statistische Analyse des Alters von IT-Mitarbeitern durch. Optimierte Statements sind in Fettschrift angegeben.
In diesem Beispiel erhöht der Natural Optimizer Compiler die Größe des Objekts um 20,5 % aufgrund von 952 Bytes an zusätzlichem Maschinencode.
| Profilparameter-Einstellung | Buffer Pool-Größe | Größe des von NOC generierten Maschinencodes |
|---|---|---|
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='
Das folgende Programm veranschaulicht den Unterschied in der CPU-Auslastung in Abhängigkeit von den Optionen, die Sie beim Kompilieren des Programms auswählen. Die folgende Tabelle listet die CPU-Auslastung in Sekunden und Prozent auf. Die in der Tabelle angegebenen Zahlen wurden während eines Testlaufs in einer IBM z/OS-Umgebung ermittelt. Sie können nur als allgemeine Orientierung dienen, da die absoluten Werte je nach eingesetzter Hardware variieren.
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 Sekunden | CPU Prozentsatz |
|---|---|---|
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 Sekunden | CPU Prozentsatz |
|---|---|---|
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 |