最適化
生成されたコードの効率を改善するには、OPTIMIZE コンパイラー・オプションを
使用することができます。
OPTIMIZE によって COBOL 最適化プログラムは以下の最適化を実行します。
- 不必要な制御権移動および非効率的な分岐を除去します。ソース・プログラムを見るだけではわからない、コンパイラーが生成する分岐も含みます。
- 中に含まれている (ネストされた) プログラムに対する CALL ステートメントのコンパイル済みコードを単純化します。可能であれば、最適化プログラムはステートメントをインラインに設定し、リンケージ・コードがなくて済むようにします。この最適化は、プロシージャー統合 と呼ばれます。プロシージャー統合を行えない場合、最適化プログラムは、できるだけ単純なリンケージ (2 つ程度の命令) を使用して、呼び出し先プログラムとの間を往復します。
- プログラムの結果に何の影響も与えない重複計算 (添え字計算や繰り返しのステートメントなど) を除去します。
- プログラムのコンパイル時に定数計算を実行することによって、定数計算を除去します。
- 定数条件式を除去します。
- 連続した項目 (MOVE CORRESPONDING の使用によって頻繁に発生するような) の移動を集約して、単一の移動にします。移動を集約するには、移動元も移動先も連続していなければなりません。
- 参照されないデータ項目を DATA DIVISION から廃棄し、これらのデータ項目をその VALUE 文節に初期化するコードの生成を抑止します。(最適化プログラムがこのアクションを取るのは、FULL サブオプションが指定された場合だけです。)
含まれているプログラム・プロシージャーの統合
含まれているプログラムのプロシージャーの統合では、含まれているプログラム・コードが、含まれているプログラムへの CALL に置き換わります。
結果として生じるプログラムは、CALL リンケージのオーバーヘッドもなく、より線形の制御フローとなり、より速く実行されます。
プログラム・サイズ: 含まれているプログラムを複数の CALL ステートメントが呼び出している場合、それぞれのプログラムがこのような各ステートメントと置き換わるのであれば、含まれているプログラムが相当大きくなる可能性があります。最適化プログラムはこの増加を 50 % 以内に制限し、それ以降はプログラムを統合しません。これにより最適化プログラムはその CALL ステートメントに、最適化の次善の策を選択します。リンケージのオーバーヘッドは命令 2 つほどにすることができます。
到達不能コード: この統合の結果として、含まれている 1 つのプログラムが何回も繰り返されることがあります。その後の最適化はプログラムの各コピーで進められるため、コードのコピー先のコンテキストによっては、到達不能な部分が検出されることがあります。
関連概念
テーブル参照の最適化
関連参照
OPTIMIZE
|