BINARY (COMP または COMP-4)

BINARY データと同義語 COMP および COMP-4 は、COBOL における 2 の補数のデータ表現です。

BINARY データは、内部または外部 10 進数データと同様に PICTURE 節を使用して宣言されますが、基礎となるデータ表現は、ハーフワード (2 バイト)、フルワード (4 バイト)、またはダブルワード (8 バイト) です。

コンパイラー・オプション TRUNC(OPT | STD | BIN) は、宣言された PICTURE 節に合わせてコンパイラーが値を修正するかどうか、その方法、およびデータ項目へのアクセス時に存在する有効データ量を決定します。

COBOL 4およびそれ以前のバージョンにおけるバイナリデータとTRUNCオプションに関する一般的なパフォーマンス上の考慮事項は、 COBOL V6 においても依然として適用されますが、各種TRUNCサブオプションの相対的なパフォーマンス差は(時に劇的に)変化しています。 このような変化は、コーディングおよびコンパイラー・オプションの選択に影響することがあります。

相対パフォーマンスと絶対パフォーマンスの差を定量化するために、 z15® マシン上のループで、2 進データ項目に対する一連の加算演算が実行されました。 以下の 4 種類のテストには同タイプで同数の算術演算が含まれていますが、桁数が異なります。 オペランドはすべて符号付きです。

  • テスト 1: 8 つの加算 (1 桁から 8 桁が 1 つずつ)
  • テスト 2: 8 つの加算 (それぞれが 9 桁)
  • テスト 3: 8 つの加算 (10 桁から 17 桁が 1 つずつ)
  • テスト 4: 8 つの加算 (それぞれが 18 桁)

次に、これらのテストを TRUNC オプションを変えてコンパイルしました。

最初の実験では、TRUNC(STD) コンパイラー・オプションを指定しています。

TRUNC(STD) はコンパイラーに、常に指定された PICTURE 節に合わせて修正するように指示します。 コンパイラーはロードされた値に、PICTURE 節で指定された桁数のみが含まれていると想定することが可能になります。

表 1. TRUNC(STD) 指定時の 4 つのテスト・ケースのパフォーマンス差の結果
TRUNC(STD) COBOL 4 vs TEST 1 COBOL 6 vs TEST 1 COBOL 6 vs COBOL 4
テスト 1: 1 桁から 8 桁 100% 100% 17.2%
テスト 2: 9 桁 153.1% 99.7% 11.2%
テスト 3: 10 桁から 17 桁 484.5% 153.5% 5.4%
テスト 4: 18 桁 759.6% 99.7% 2.3%
これらの結果は、以下を実証しています。
  • TRUNC(STD) を使用した場合、COBOL 6 はすべての長さで COBOL 4 よりパフォーマンスが優れている。
  • COBOL 4 と COBOL 6 ではどちらも、桁数の増加に伴ってパフォーマンスが低下する。ただし、COBOL 6 の使用時には COBOL 4 に比べて低下が緩やかであり、低下の全体量も小さい。

2 番目の実験では、TRUNC(BIN) コンパイラー・オプションを指定しています。 このオプションを指定することは、すべての BINARY データに COMP-5 型を使用することと同等です。

TRUNC(BIN) はコンパイラーに、指定された PICTURE 節に合わせて値を修正するのではなく、基礎データ表現 (2 バイト、4 バイト、または 8 バイト) に値を修正し戻すことのみが可能であることを指示します。 また、このオプションはコンパイラーに、ロードされた値が 2 バイト、4 バイト、または 8 バイト相当の有効データを含む可能性があることを想定するよう要求します。

表 2. TRUNC(BIN) 指定時の 4 つのテスト・ケースのパフォーマンス差の結果
TRUNC(BIN) COBOL 4 vs TEST 1 COBOL 6 vs TEST 1 COBOL 6 vs COBOL 4
テスト 1: 1 桁から 8 桁 100% 100% 36.2%
テスト 2: 9 桁 165.8% 100% 21.8%
テスト 3: 10 桁から 17 桁 3889.4% 2363.8% 22.0%
テスト 4: 18 桁 3889.2% 2363.7% 22.0%
これらの結果は、以下を実証しています。
  • TRUNC(BIN) を使用した場合、COBOL 6 はやはりすべての長さで COBOL 4 よりパフォーマンスが優れている。
  • 9 桁でのテストの場合、COBOL 6 は 低速化を示さない。
  • 長さが 9 桁を超える場合、COBOL 4 と COBOL 6 の両方でパフォーマンスが劇的に低下する (ただし、絶対量では COBOL 4 がより顕著)。 これは、全整数ハーフ/フル/ダブルワードまでのデータが入力データに含まれる可能性がある (さらに、追加のデータ型変換とライブラリー・ルーチンが必要になる) という TRUNC(BIN) の要件によるものです。
3 番目の実験および最後の実験では、TRUNC(OPT) コンパイラー・オプションを指定しています。 TRUNC(OPT) はパフォーマンス・オプションです。 コンパイラーは、入力データが PICTURE 節に準拠しているものと想定し、その後、以下のうち最適な方法でデータを自由に操作できます。
  • TRUNC(STD) の場合と同様に、PICTURE 節に合わせて修正するか、または
  • TRUNC(BIN) の場合と同様に、2 バイト境界、4 バイト境界、または 8 バイト境界に合わせて修正する
表 3. TRUNC(OPT) 指定時の 4 つのテスト・ケースのパフォーマンス差の結果
TRUNC(OPT) COBOL 4 vs TEST 1 COBOL 6 vs TEST 1 COBOL 6 vs COBOL 4
テスト 1: 1 桁から 8 桁 100% 100% 87.3%
テスト 2: 9 桁 400.3% 100.9% 22.0%
テスト 3: 10 桁から 17 桁 235.3% 100.6% 37.3%
テスト 4: 18 桁 6099.0% 156.9% 2.3%
これらの結果は、以下を実証しています。
  • TRUNC(OPT) を使用した場合、COBOL 6 はやはり COBOL 4 よりパフォーマンスが優れている。
  • COBOL 6 は 18 桁までは低速化を示さないが、この最長の長さにおいても、COBOL 4 より大幅にパフォーマンスが優れている。
注: TRUNC (OPT) は、バイナリー域に移動されるデータが PICTURE 節に準拠していることが確実である場合にのみ使用してください。そうでないと、予測不能な結果が生じる可能性があります。 詳しくは、「 Enterprise COBOL for z/OS® プログラミング・ガイド 」の「 TRUNC 」を参照してください。
すべての TRUNC オプションとデータ項目長にわたって、上述のように COBOL 6 は COBOL 4 よりパフォーマンスが優れています。 このような向上は、以下の理由によるものです。
  • 64 ビット「G」形式の命令の使用により、8 桁を超える事例ではるかに効率的なコードが可能
  • 非常に大きい TRUNC(BIN) のための、より効率的なライブラリー・ルーチン

V6 への移行申請を優先する具体的な例として、バイナリ倍長ワード演算(大型バイナリ演算)が挙げられます。これは、この種の演算において、コンパイラの COBOL 4と比較した性能向上を示すものです。 この例で、COBOL 6 は COBOL 4 以前のコンパイラー・リリースに比べて大幅に高速化しています。

各種 TRUNC オプション間のパフォーマンスの相対的差異は、COBOL 4 に比べて少なくなっています。 これは主に、コンパイラーがオーバーフロー用のランタイム・テストを挿入することに起因します。 オーバーフローが発生しなければ、負荷の高い「divide」ハードウェア命令が回避されます。

データが PICTURE 節に準拠していることがわかっている場合は、やはり TRUNC(OPT) が選択すべき総合的な最良オプションですが、相対的に言えば、TRUNC(STD) に対する向上は COBOL 4 の場合より小さく、また、COBOL 6 ではいずれのオプションでも総合的な絶対パフォーマンスは優れています。

TRUNC(BIN) は、COMPUTE または MOVE の結果からの格納時にはコードをより効率化することが可能ですが、これらのデータ項目が算術演算ステートメントへの入力として使用される場合、このオプションがパフォーマンスに重大な悪影響を及ぼすことに変わりはありません (コンパイラーが最大 2 バイト、4 バイト、8 バイトのサイズを想定する必要があるため)。 COBOL 6 は TRUNC(STD) の修正コードを最適化するため、TRUNC(BIN) によるパフォーマンス上の利点はやや少なくなりました。

TRUNC(BIN) を使用する代わりに、選択したデータ項目にのみ COMP-5 を指定する方が良い場合があります。 例えば、特に COMPUTE ステートメント内のデータ項目が COMP-5 で指定されていない場合、一般的にパフォーマンスは向上します。