30.1.2 チェック項目の説明
- 〈この項の構成〉
(1) 数字項目の定義や演算を工夫できないか
データ項目の属性変換が発生しないようにしたり,算術演算子を少なくしたりして中間結果のけた数を最小にすると処理速度が向上します。そのために留意する点を次に示します。
(a) 数字項目のけた拡張機能を使用しない場合
-
数字項目を定義する場合は,SYNC句指定のある符号付き2進項目(COMP)とし,また,けた数を必要以上に大きくしないようにします。
-
10進項目は演算に使わないようにします。例えば,入出力レコード中の10進のデータ項目を演算で頻繁に使うときは,データ項目を2進項目の作業領域に移してから演算するようにします。
-
属性の異なるもの同士の演算は避けます。例えば,2進項目と内部10進項目,2進項目と外部10進項目などの演算を避けます。
-
複雑なCOMPUTE文は分割するなどし,一つのCOMPUTE文中の算術演算子を少なくします。COMPUTE文中に多くの算術演算子を使うと,けたあふれも発生しやすくなります。
-
1バイト2進項目を使用する処理はできるだけ局所化し,演算に使用する項目には2バイト2進項目を使用するようにします。
(b) 数字項目のけた拡張機能を使用する場合
-
けた数が19〜38けたの数字項目を定義する場合は,内部10進項目(COMP-3)とし,けた数を必要以上に大きくしないようにします。
-
けた数が19〜38けたの数字項目や数字定数を使用する処理は,ソースファイルごとにできるだけ局所化します。
-
属性の異なるもの同士の演算は避けます。例えば,2進項目と内部10進項目,2進項目と外部10進項目などの演算を避けます。
-
複雑なCOMPUTE文は分割するなどし,一つのCOMPUTE文中の算術演算子を少なくします。COMPUTE文中に多くの算術演算子を使うと,けたあふれも発生しやすくなります。
-
1バイト2進項目を使用する処理はできるだけ局所化し,演算に使用する項目には2バイト2進項目を使用するようにします。
数字項目のけた拡張機能については,「28. 数字項目のけた拡張機能(AIX(64),Linux(x64)で有効)」を参照してください。
(3) 添字は定数で指定できないか
添字を定数にすると,アドレス計算のための命令が生成されないので,処理速度が向上します。
- (悪い例)
: MOVE 3 TO J. MOVE A TO B(J).
- (良い例)
: MOVE A TO B(3).
(4) 比較する項目の長さは同じか
英数字項目を比較するときに項目の長さが異なると,コンパイラは長さの差の部分が空白かどうかを調べるオブジェクトコードを生成します。このため,項目の長さを同じにすると処理速度が向上します。
(5) 2進項目,指標データ項目,浮動小数点項目の境界は適切な位置にあるか
2進項目,指標データ項目,浮動小数点項目がそれぞれの適切な境界にないと,処理速度が遅くなります。境界については,マニュアル「COBOL2002 言語 標準仕様編」 「4.4.1(7) 実行用コードの効率を高めるための項目のけた詰め」を参照してください。
境界を合わせるには,SYNC句を指定する方法と,利用者がバイト数を計算して合わせる方法とがあります。ただし,SYNC句を使うと処理速度は向上しますが,多用すると実行可能プログラムが必要以上に大きくなることがあるので注意してください。
バイト数を計算して境界を合わせる例を次に示します。
- (例)
WORKING-STORAGE SECTION. 01 DATA-SGROUPS. *> 境界合わせが必要なものをまとめ,境界合わせを *> 計算しながら並べる 02 A PIC S9(12) USAGE COMP. 02 B PIC S9(7) USAGE COMP. 02 C PIC S9(7) USAGE COMP. 02 D USAGE COMP-1. 02 E USAGE COMP-1. 02 F USAGE COMP-2. 02 G PIC S9(14) USAGE PACKED-DECIMAL. 02 H PIC S9(10) USAGE COMP. 02 I USAGE INDEX. *> 境界合わせが不要なものをまとめる 02 J PIC S9(10) DISPLAY.
(6) USAGE句項目の指定や,小数点以下のけた数は一致しているか
USAGE句項目が一致していないと,データ変換命令が生成されるため処理速度が遅くなります。また,小数点以下のけた数が一致していないと,演算のときにけた数を合わせる命令が生成されるため処理速度が遅くなります。
- (悪い例)
WORKING-STORAGE SECTION. 77 TOL PIC S9(3) USAGE COMP. 77 NUM PIC S9(3)V99 USAGE PACKED-DECIMAL. 77 AVE PIC S9(3)V9. : PROCEDURE DIVISION. : COMPUTE AVE = TOL / NUM.
- (良い例)
WORKING-STORAGE SECTION. 77 TOL PIC S9(3)V9 USAGE PACKED-DECIMAL. 77 NUM PIC S9(3)V9 USAGE PACKED-DECIMAL. 77 AVE PIC S9(3)V9 USAGE PACKED-DECIMAL. : PROCEDURE DIVISION. : COMPUTE AVE = TOL / NUM.
(7) データ転送にむだはないか
入力レコードを作業領域に転送するとき,むだなデータを転送することがよくあります。転記する文は,項目の長さに比例して時間が掛かります。複数のMOVE文に分けて実際に転送する長さを短くすると処理速度が向上します。
- (悪い例1)
01 A1. *> 入力領域 02 FILLER PIC X(300). 02 B1 PIC X(5). 02 FILLER PIC X(30). 02 C1 PIC X(5). 01 A2. *> 作業領域 02 FILLER PIC X(300). 02 B2 PIC X(5). 02 FILLER PIC X(30). 02 C2 PIC X(5). : PROCEDURE DIVISION. : MOVE A1 TO A2.
- (良い例1)
01 A1. *> 入力領域 02 FILLER PIC X(300). 02 B1 PIC X(5). 02 FILLER PIC X(30). 02 C1 PIC X(5). 01 A2. *> 作業領域 02 FILLER PIC X(300). 02 B2 PIC X(5). 02 FILLER PIC X(30). 02 C2 PIC X(5). : PROCEDURE DIVISION. : MOVE B1 TO B2. MOVE C1 TO C2.
- (悪い例2)
FILE SECTION. FD AFILE RECORDING MODE V. 01 A1. 02 L PIC S9(5) USAGE COMP. *> 入力レコード長 02 FILLER PIC X(4000). *> 最大レコードだけを定義している : WORKING-STORAGE SECTION. 01 WK. 02 詳細なレコード定義 : PROCEDURE DIVISION. : MOVE A1 TO WK.
- (良い例2)
FILE SECTION. FD AFILE RECORD VARYING IN SIZE TO 4000 DEPENDING ON CNT. 01 A1 PIC X(4000). : WORKING-STORAGE SECTION. 77 CNT PIC 9(4). 01 WK. 02 詳細なレコード定義 : PROCEDURE DIVISION. : MOVE A1(1:CNT) TO WK(1:CNT).
(9) 可変長項目のあとに固定長項目を定義していないか
可変長項目の長さは実行時に変化します。可変長項目のあとにある固定長項目を参照する文があると,コンパイラはアドレスづけのための特別なオブジェクトコードを生成します。このため,通常の固定長項目を参照するよりも処理速度が遅くなります。
また,可変長項目のあとにその可変長項目に従属する項目以外を記述することは,COBOL規格で禁止されています。そのため,このような記述をする場合は,COBOL規格外の記述として注意する必要があります。
- (悪い例)
WORKING-STORAGE SECTION. 01 V-GROUP. 02 C PIC X OCCURS …… DEPENDING ON I. 02 A PIC S9(5) USAGE COMP. 02 B PIC 9(6). :
- (良い例)
WORKING-STORAGE SECTION. 01 J-GROUP. 02 A PIC S9(5) USAGE COMP. 02 B PIC 9(6). 02 C PIC X OCCURS …… DEPENDING ON I. :