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 |