バージョン 4.2.5
 —  Natural Optimizer Compiler  —

パフォーマンスの考慮事項

このドキュメントでは、次のトピックについて説明します。


フォーマット

算術演算でパック型数値(P)および整数(I4)のデータフォーマットを使用する場合に、最適なパフォーマンスが得られます。

パック型数値(P)、アンパック型数値(N)、整数(I)、および浮動小数点(F)のフォーマット間のデータ変換は避けます。最適化されたコードであっても、処理オーバーヘッドが発生するためです。

最適化されたコードでは、解釈のオーバーヘッドがないため、さまざまなデータフォーマット間の相違はより顕著になります。例えば、最適化されたコードの場合にフォーマット N ではなく P を使用することで得られるパフォーマンスの向上は、通常のコードの場合よりも大きくなります。

例:

A = A + 1

上記の数値計算の場合

この単純なステートメントに Natural Optimizer Compiler を適用することで得られるパフォーマンスの向上は、以下のとおりです。

Top of page

配列

以下のような配列範囲処理は、

MOVE A(*) TO B(*)

同じ機能を FOR ステートメント処理ループを使用してプログラムした場合よりも、効率的に実行されます。 このことは、最適化されたコードにも該当します。

索引を使用する場合、最適なパフォーマンスを得るには整数フォーマット I4 を使用する必要があります。

Top of page

英数字フィールド

英数字定数を英数字変数(フォーマット A)に移動する場合、または英数字変数を英数字定数と比較する場合、英数字定数の長さを変数の長さに合わせて調整することをお勧めします。 これによって、処理は大幅に速くなります。例えば、以下のようにすると

A(A5):='XYZAB'


...
IF A = 'ABC  ' THEN ...

以下の場合よりも速くなります。

IF A = 'ABC' THEN ...

Top of page

DECIDE ON

DECIDE ON ステートメントをシステム変数、配列、またはパラメータ operand1 とともに使用する場合、LOCAL ストレージセクションで定義されている同じタイプおよび長さのスカラ変数に値を移動したほうが効率的です。

Top of page

数値

割り当てまたは算術演算で数値定数を使用する場合は、定数が処理と同じタイプになるようにしてください。

一般的なルール

この方法は MULTIPLY および DIVIDE には必要ありません。

Top of page

変数の位置付け

最適化処理を簡単にするには、すべてのスカラ参照をデータセクションの最初に、すべての配列参照をデータセクションの最後に置くようにします。

Top of page

変数のキャッシュ

Natural Optimizer Compiler には、パフォーマンスをさらに高めるアルゴリズムが含まれています。 パフォーマンスの観点では、ステートメントはオペランドのタイプによって異なります。 1 つ以上のオペランドがパラメータ、配列、またはタイプ N(数値)のスカラフィールド、あるいはこれらのオペランドの組み合わせである場合、ステートメントの実行は遅くなります。 NOC では、プログラムフローが分析され、これらの特性の 1 つ以上を持つどの変数が、書き込みなしで複数回読み込まれるかが判別されます。 次に、各変数の値は、以下の条件に従って、一時キャッシュエリアに移動されてすばやくアクセスされます。

変数のキャッシュに最も適しているのは、同じ変数に繰り返しアクセスする長いシーケンスを含むプログラムであり、特に変数が配列である場合です。 変数のキャッシュによって、複雑で何度も繰り返されるアドレス計算が回避されます。

変数のキャッシュの例

以下のサンプルプログラムは、変数のキャッシュの利点を示しています。 NODBG(下記参照)および CACHE=ON でカタログして、このプログラムをテスト環境で実行すると、NODBG および CACHE=OFF でプログラムを実行する場合に必要となる時間の 47 %かかりました。 プログラムを CACHE=ON でカタログすると、NOC によって生成されるコードは 856 バイトから 376 バイトに削減されます。

DEFINE DATA LOCAL         
1 ARR(N2/10,10,10)        
1 I(I4) INIT <5>          
1 J(I4) INIT <6>          
1 K(I4) INIT <7>          
END-DEFINE                
DECIDE ON EVERY ARR(I,J,K)
 VALUE 10 IGNORE          
 VALUE 20 IGNORE          
 VALUE 30 IGNORE          
 VALUE 40 IGNORE          
 VALUE 50 IGNORE          
 VALUE 60 IGNORE          
 VALUE 70 IGNORE          
 VALUE 80 IGNORE          
 VALUE 90 IGNORE          
 NONE IGNORE              
END-DECIDE
注意:
キャッシュされている変数の内容を Natural デバッガのコマンド MODIFY VARIABLE で変更すると、元の変数の内容のみが変更されます。 キャッシュされている値(後続のステートメントで使用される可能性がある)は変更されません。 そのため、Natural デバッガを使用する場合は、変数のキャッシュの使用に注意する必要があります。 Natural の『デバッガ』ドキュメントも参照してください。

Top of page

NODBG

プログラムを完全にテストして実稼働に移したら、「Optimizer オプション」セクションで説明されているように、プログラムを NODBG オプションでカタログする必要があります。 デバッグコードがないと、最適化されたステートメントの実行は 10 %~30 %速くなります。

このオプションを指定すると、INDX または OVFLW オプションがオンになっていても、デバッグを容易にするためのコードは削除されます。 

Top of page