データ項目の属性変換が発生しないようにしたり,算術演算子を少なくしたりして中間結果のけた数を最小にすると処理速度が向上します。そのために留意する点を次に示します。
添字は4バイトの符号付き2進項目として処理されます。それ以外の形式のときは,データ変換命令が生成されるため処理速度が遅くなります。
添字を定数にすると,アドレス計算のための命令が生成されないので,処理速度が向上します。
:
MOVE 3 TO J.
MOVE A TO B(J).
:
MOVE A TO B(3).
英数字項目を比較するときに項目の長さが異なると,コンパイラは長さの差の部分が空白かどうかを調べるオブジェクトコードを生成します。このため,項目の長さを同じにすると処理速度が向上します。
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.
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.
入力レコードを作業領域に転送するとき,むだなデータを転送することがよくあります。転記する文は,項目の長さに比例して時間が掛かります。複数のMOVE文に分けて実際に転送する長さを短くすると処理速度が向上します。
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.
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.
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.
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).
小数点があると処理が複雑になることがあり,処理速度が遅くなります。
可変長項目の長さは実行時に変化します。可変長項目のあとにある固定長項目を参照する文があると,コンパイラはアドレスづけのための特別なオブジェクトコードを生成します。このため,通常の固定長項目を参照するよりも処理速度が遅くなります。
また,可変長項目のあとにその可変長項目に従属する項目以外を記述することは,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.
:
READ INTO,WRITE FROMを使うと,レコードの入出力処理でプログラム内のレコード領域との間でデータ転送が発生し,処理速度が遅くなります。
このシステムでは,作業場所節および局所場所節で定義した項目は,定義した場所に確保されます。このため,一緒に使用する項目は近くに定義して参照を局所化すると処理速度が向上します。