以下の例では、どのような場合に Natural Optimizer Compiler が最も効果的に使用され、その機能が示されるかを説明します。
このドキュメントでは、次のトピックについて説明します。
以下のプログラムの場合、Natural Optimizer Compiler の使用によって得られるものはありません。
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
以下のプログラムを Natural Optimizer Compiler でコンパイルすると、パフォーマンスは約 30 %向上します。つまり、CPU 負荷が 30 %減少します。 このプログラムでは、IT 従業員の年齢の統計分析が実行されます。 最適化されたステートメントは、太字で示されています。
この例では、NOC による 952 バイトの追加マシンコードによって、オブジェクトサイズは 20.5 %増加しています。
プロファイルパラメータの設定 | バッファプールのサイズ | 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='
以下のプログラムは、プログラムをコンパイルするときに選択するオプションに応じて、CPU の使用の違いを示しています。 以下の表は、CPU の使用率を秒およびパーセントで示しています。 表内の数値は、IBM z/OS 環境でのテスト実行中に測定されました。 値は適用されるハードウェアによって異なるため、一般的な参考値としてのみご利用ください。
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
オプション | CPU 秒 | CPU パーセント |
---|---|---|
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
オプション | CPU 秒 | CPU パーセント |
---|---|---|
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 |