29.1.2 チェック項目の説明

<この項の構成>
(1) 数字項目の定義や演算を工夫できないか
(2) 添字は4バイトの符号付き2進項目で定義しているか
(3) 添字は定数で指定できないか
(4) 比較する項目の長さは同じか
(5) 2進項目,指標データ項目,浮動小数点項目の境界は適切な位置にあるか
(6) USAGE句項目の指定や,小数点以下のけた数は一致しているか
(7) データ転送にむだはないか
(8) 不要な小数点はないか
(9) 可変長項目のあとに固定長項目を定義していないか
(10) READ INTO,WRITE FROMを使っていないか
(11) 作業場所節および局所場所節で,一緒に使う項目は互いに近くで定義しているか

(1) 数字項目の定義や演算を工夫できないか

データ項目の属性変換が発生しないようにしたり,算術演算子を少なくしたりして中間結果のけた数を最小にすると処理速度が向上します。そのために留意する点を次に示します。

(2) 添字は4バイトの符号付き2進項目で定義しているか

添字は4バイトの符号付き2進項目として処理されます。それ以外の形式のときは,データ変換命令が生成されるため処理速度が遅くなります。

(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).

(8) 不要な小数点はないか

小数点があると処理が複雑になることがあり,処理速度が遅くなります。

(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.
              :

(10) READ INTOWRITE FROMを使っていないか

READ INTO,WRITE FROMを使うと,レコードの入出力処理でプログラム内のレコード領域との間でデータ転送が発生し,処理速度が遅くなります。

(11) 作業場所節および局所場所節で,一緒に使う項目は互いに近くで定義しているか

このシステムでは,作業場所節および局所場所節で定義した項目は,定義した場所に確保されます。このため,一緒に使用する項目は近くに定義して参照を局所化すると処理速度が向上します。