COBOL コンパイラーは、いくつかの方法でテーブル参照を最適化します。
テーブル・エレメント参照 ELEMENT(S1 S2 S3) (ここで、S1、S2、および S3 は添え字です) の場合、コンパイラーは以下の式を評価します。
comp_s1 * d1 + comp_s2 * d2 + comp_s3 * d3 + base_address
ここで、comp_s1 は 2 進数に変換された後の S1 の値であり、comp-s2 は 2 進数に 変換された後の S2 の値です。以下同様です。 それぞれの次元のストライドは d1、d2、および d3 です。ある特定次元のストライド は、その次元での出現番号が 1 だけ違い、かつ他の出現番号が等しいようなテーブル・エレメント相互間の距離 (バイト単位) です。例えば、上記の例の 2 次元のストライド d2 は、ELEMENT(S1 1 S3) と ELEMENT(S1 2 S3) との間の距離 (バイト単位) です。
指標計算は添え字計算に類似していますが、指標値ではそれらの中にストライドを含めているので、 乗算をする必要がないという点が異なります。指標計算には、指標をレジスターに ロードすることも含まれます。これらのデータ転送は、個々の添え字計算の項を最適化する場合とほぼ同様に、最適化することができます。
コンパイラーは式を左から右へと評価していくので、定数または重複する添え字が左端にあると、最適化プログラムが計算を除去する可能性が最も高くなります。
C1、C2、. . . . . は、定数データ項目であり、V1、V2、. . . . . は変数データ項目です。したがって、テーブル・エレメント参照 ELEMENT(V1 C1 C2) の場合、コンパイラーは個々の項 comp_c1 * d2 および comp_c2 * d3 だけしか、式から定数として除去できません。
comp_v1 * d1 + comp_c1 * d2 + comp_c2 * d3 + base_address
しかし、テーブル・エレメント参照 ELEMENT(C1 C2 V1) の場合、コンパイラーは、副次式 comp_c1 * d1 + comp_c2 * d2 全体を、式から定数として除去することができます。
comp_c1 * d1 + comp_c2 * d2 + comp_v1 * d3 + base_address
テーブル・エレメント参照 ELEMENT(C1 C2 C3) では、添え字はすべて定数なので、実行時に添え字計算は行われません。式は次のとおりです。
comp_c1 * d1 + comp_c2 * d2 + comp_c3 * d3 + base_address
最適化プログラムを使用すると、この参照は、スカラー (テーブルでない) 項目への参照と同じくらい効率的になります。
テーブル・エレメント参照 ELEMENT(V1 V3 V4) および ELEMENT(V2 V3 V4) では、個々の項 comp_v3 * d2 および comp_v4 * d3 だけが、テーブル・エレメントの参照に必要な式における共通副次式です。
comp_v1 * d1 + comp_v3 * d2 + comp_v4 * d3 + base_address comp_v2 * d1 + comp_v3 * d2 + comp_v4 * d3 + base_address
しかし、2 つのテーブル・エレメント参照 ELEMENT(V1 V2 V3) および ELEMENT(V1 V2 V4) の場合は、副次式 comp_v1 * d1 + comp_v2 * d2 全体が、テーブル・エレメントの参照に必要な 2 つの式間で共通となります。
comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address comp_v1 * d1 + comp_v2 * d2 + comp_v4 * d3 + base_address
2 つの参照 ELEMENT(V1 V2 V3) および ELEMENT(V1 V2 V3) では、式は同じです。
comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address
最適化プログラムを使用すると、同じエレメントへの 2 度目 (およびそれ以降) の参照は、スカラー (テーブルでない) 項目への参照と同じ効率になります。
従属 OCCURS DEPENDING ON データ項目の入っているグループ項目は可変長です。プログラムは、可変長データ項目が参照されるたびに特殊コードを実行しなければなりません。
このコードはライン外のものなので、最適化の妨げになる可能性があります。さらに、可変長データ項目を処理するためのコードは、固定サイズ・データ項目を処理するコードよりかなり効率が下がり、処理時間も大幅に増加することがあります。例えば、可変長データ項目を比較したり移動したりするためのコードには、ライブラリー・ルーチンの呼び出しが必要なため、固定長データ項目の場合の同じコードよりかなり低速になります。
相対指標参照は、直接指標参照と同じくらい迅速に実行されます。
ELEMENT (I5, J3, K2) の直接索引付けには、次のプリプロセスが必要になります。
SET I5 TO I SET I5 UP BY 5 SET J3 TO J SET J3 DOWN BY 3 SET K2 TO K SET K2 UP BY 2
この処理のため、直接索引付けは、ELEMENT (I + 5, J - 3, K + 2) の相対索引付けよりも効率が悪くなります。
関連概念
最適化
関連タスク
テーブルの効率的処理