COBOLの文字列・数値演算を高速化!初心者でもできるパフォーマンスチューニング
生徒
「先生、COBOLのプログラムって古い言語だから動作が遅いって聞いたんですけど、本当ですか?」
先生
「実はそんなことはないんですよ。COBOLでも書き方を工夫すれば、文字列処理も数値演算もとても高速に動かせます。」
生徒
「そうなんですね!でもどうやって速くするんですか?」
先生
「今日は、COBOLの文字列操作と数値演算をチューニング(最適化)して、効率を上げる方法を詳しく説明しますね。」
1. パフォーマンスチューニングとは?
パフォーマンスチューニングとは、プログラムをより速く、効率的に動かすために処理方法を改善することです。COBOLは銀行や保険などの大規模システムでも現役で使われていますが、処理するデータ量が多いときには、ちょっとした工夫でスピードが大きく変わります。
特に、文字列操作(例:名前や住所の結合)や数値演算(金額計算など)は処理が重くなりやすいため、チューニングが重要です。
2. 文字列処理を速くするコツ
COBOLでは文字列を扱うときに、「MOVE」「STRING」「UNSTRING」などの命令を使います。これらの命令は便利ですが、使い方を間違えると処理速度が遅くなってしまいます。
① 不要なSTRING命令を減らす
STRING命令は複数の文字列を結合する命令です。しかし、たくさんの文字列を1つずつSTRINGでつなげると処理が重くなります。できるだけ1回のSTRINGでまとめて結合するのがポイントです。
STRING FIRST-NAME DELIMITED BY SPACE
LAST-NAME DELIMITED BY SPACE
INTO FULL-NAME
END-STRING
このように、一度にまとめて結合すれば処理回数が減り、プログラムのスピードが上がります。
② MOVEで代用できるところはMOVEを使う
MOVEは単純に値をコピーする命令で、非常に高速です。もし文字列を結合せずに単純に代入したいだけなら、STRINGよりもMOVEを使いましょう。
MOVE "TOKYO" TO CITY-NAME
これは単純な処理なので、STRINGよりもCPUへの負担が少なく、結果的にプログラム全体のパフォーマンスが向上します。
③ UNSTRINGは必要な部分だけを取り出す
UNSTRING命令は文字列を分解する命令です。住所やコードなどを分けるときに便利ですが、すべての要素を取り出そうとすると時間がかかります。必要な部分だけを取り出すようにしましょう。
UNSTRING ADDRESS DELIMITED BY "-"
INTO ZIP-CODE PREFECTURE
このように、必要なデータだけ取り出せば、無駄な処理を省くことができます。
3. 数値演算を高速化するテクニック
数値演算はCOBOLの得意分野ですが、扱う桁数や計算回数が多いと処理時間が増えてしまいます。ここでは、効率的に演算を行うための3つの方法を紹介します。
① 必要以上に大きなPIC定義を避ける
PIC(ピクチャ)句とは、変数の桁数や形式を定義する部分です。桁数が多いほど、計算に時間がかかります。金額などの計算で桁が多すぎる定義は避けましょう。
01 TOTAL-AMOUNT PIC 9(7)V99 VALUE 0.
本当に必要な桁数だけを設定することで、COBOLの計算エンジンがより効率的に動作します。
② 計算の順番を工夫する
たとえば、大きな数同士の掛け算を何度も行うよりも、共通部分を先に計算しておくとスピードが上がります。これは「共通項の前計算」と呼ばれるテクニックです。
MULTIPLY TAX-RATE BY BASE-AMOUNT GIVING TAX
ADD BASE-AMOUNT TO TAX GIVING TOTAL
このように計算を整理しておくと、同じ計算を何度も繰り返さずに済み、プログラムが軽くなります。
③ COMPUTE文を適切に使う
COMPUTE文を使うと、1行で複雑な計算ができます。ただし、何度も使うとパフォーマンスが低下することもあります。単純な計算ではADDやMULTIPLYを使う方が高速です。
COMPUTE TOTAL = PRICE * TAX-RATE + SHIPPING-COST
処理回数が少ない場合は便利ですが、大量データを処理する場合は、計算式を分割して実行する方が速くなることもあります。
4. ループ処理での最適化ポイント
COBOLでは、数値演算や文字列操作をループの中で繰り返すことがあります。このとき、不要な処理をループ内に入れると速度が大きく落ちます。
① 定数や固定値はループの外に出す
ループの中で毎回同じ値を設定するのは無駄です。固定値はループの外で設定しておきましょう。
MOVE 1.10 TO TAX-RATE
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
COMPUTE TOTAL(I) = PRICE(I) * TAX-RATE
END-PERFORM
このようにすることで、毎回TAX-RATEを計算する必要がなくなり、処理速度が向上します。
② DISPLAY文は最小限にする
DISPLAY文(画面出力)は非常に遅い処理です。ループ内で何度も出力すると極端に遅くなります。必要なときだけ表示するようにしましょう。
IF I = 1000
DISPLAY "計算が完了しました。"
END-IF
5. 実務で使えるチューニング例
最後に、実際の現場でよく行われるパフォーマンスチューニングの例を紹介します。これは金額の合計を計算する処理を効率化したサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. SPEED-UP.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(5) VALUE 10000.
01 TAX-RATE PIC 9V99 VALUE 1.10.
01 TOTAL PIC 9(6)V99 VALUE 0.
PROCEDURE DIVISION.
MULTIPLY PRICE BY TAX-RATE GIVING TOTAL
DISPLAY "税込金額:" TOTAL
STOP RUN.
税込金額:11000.00
このように、計算式を簡潔にし、不要な命令を使わないことで、COBOLのプログラムは驚くほど速く動作します。COBOLは「遅い言語」ではなく、「正しく書けば非常に高速」なのです。