Index      home page









COBOL II を使用する場合の

性能上の注意点

Html 1.0 版 1996.7.3 熊谷
COBOL II 使用時の性能上の注意点 1994.12.14 −はじめに− 次のような特徴を持つ適用業務の開発において COBOL II を使用する場合にCPU時間削減上で注意 すべきことを、某適用業務についての性能改善の結果を中心に、まとめたものである。 某適用業務の特徴 1.扱うトランザクションの数が多い 2.扱うトランザクションのサイズが大きい 3.可変長のデータを扱っている CPU時間削減のためには次の二つの方法がある。 1.実行ステップ数を減らす 2.CPU使用量の多いインストラクション(MVCL,CLCL)を減らす 特に2.の場合、たとえ実行ステップ数が増加したとしてもCPU時間が削減し得ることに注目して 頂きたい。 COBOL II がどのようにアセンブラで展開するかをある程度意識しないとCPU時間削減において 無駄な努力ををすることになりかねない。 この資料が性能改善の手伝いになれば幸いである。
----- 目次 ----- 1.INITIALIZE 命令について ・・・・・・・・・・・・・・・・・・ 1 1)オカレンスの多いテーブルに対する INITIALIZE 命令 ・・・・・・・・・・・・・・・・・・ 1 2)大きいサイズの領域に対する INITIALIZE 命令 ・・・・・・・・・・・・・・・・・・ 3 2.サブプログラムとの受渡しを、領域からポインタへ ・・・・・・・・・・・・・・・・・・ 4 1)領域を使用頻度の高いサブプログラムに受け渡す時 ・・・・・・・・・・・・・・・・・・ 4 2)メインプログラムから受け渡される領域のサイズが大きい時 ・・・・・・・・・・・・・・・・・・ 6 (2−1)構造体渡しの時 ・・・・・・・・・・・・・・・・・・ 6 (2−2)領域渡しの時 ・・・・・・・・・・・・・・・・・・ 8 3.INITIAL属性 ・・・・・・・・・・・・・・・・・・ 10 4.バイナリーサーチ化 ・・・・・・・・・・・・・・・・・・ 12 5.データの部分参照をする場合 ・・・・・・・・・・・・・・・・・・ 13 6.アセンブラからCOBOL II を呼ぶ場合 ・・・・・・・・・・・・・・・・・・ 14
1.INITIALIZE 命令について 1)オカレンスの多いテーブルに対する INITIALIZE 命令 例えば、次のテーブルを INITIALIZE すると、 01 TBL-AREA. BLW=0000+000 05 TBL-FURIWAKE. BLW=0000+000,0000 10 TBL-FURI OCCURS 15. BLW=0000+000,0000 15 TBL-ENTRY-FLG PIC X(01). BLW=0000+000,0000 15 TBL-PRFGRPCD PIC X(03). BLW=0000+001,0000 15 TBL-SHCDAREA. BLW=0000+004,0000 20 TBL-SHCD-RECLEN PIC S9(09) COMP. BLW=0000+004,0000 20 TBL-SHCD-JNLSBT PIC X(04). BLW=0000+008,0000 20 TBL-SHCD-DATAREA. BLW=0000+00C,0000 25 TBL-SHCD-DAT OCCURS 300. BLW=0000+00C,0000 30 TBL-SHCD-DATSBT PIC X(04). BLW=0000+00C,0000 30 TBL-SHCD-SHCD PIC X(07). BLW=0000+010,0000 30 TBL-SHCD-YKKBN PIC X(01). BLW=0000+017,0000 30 TBL-SHCD-YKSSK PIC X(06). BLW=0000+018,0000 30 TBL-SHCD-TKSSK PIC X(06). BLW=0000+01E,0000 15 TBL-KSHCDAREA. BLW=0001+C2C,0001 20 TBL-KSHCD-RECLEN PIC S9(09) COMP. BLW=0001+C2C,0001 20 TBL-KSHCD-JNLSBT PIC X(04). BLW=0001+C30,0001 20 TBL-KSHCD-DATAREA. BLW=0001+C34,0001 25 TBL-KSHCD-DAT OCCURS 300. BLW=0001+C34,0001 30 TBL-KSHCD-DATSBT PIC X(04). BLW=0001+C34,0001 30 TBL-KSHCD-SHCD PIC X(07). BLW=0001+C38,0001 30 TBL-KSHCD-YKKBN PIC X(01). BLW=0001+C3F,0001 30 TBL-KSHCD-YKSSK PIC X(06). BLW=0001+C40,0001 30 TBL-KSHCD-TKSSK PIC X(06). BLW=0001+C46,0001 INITIALIZE TBL-AREA. この時の展開形は次のページのように、オカレンスの数だけループを繰り返しながら初期化をする ため本当に必要な項目のみを 初期化するようにする。 実行ステップ数を減らしたい場合には、 01 TEMP-AREA REDEFINES TBL-AREA PIC X(長さ). INITIALIZE TEMP-AREA. または MOVE SPACE TO TBL-AREA. としスペースで初期化した後に数値項目を個々に初期化する。 ただしこの場合、 CPU 使用量の多い MVCL 命令が生成されるため CPUタイムはさほど減らない。 最も望ましいのはテーブルの有効エントリー数を持ち、テーブルの初期化無しに処理できる形に 変えることである。 - 1 -
(LIT+0) 00000001 D7E3C5E2 E3F0F3C1 00000000 0000012C 00000035 00000200 00000001 (LIT+32) 00000000 00000000 80000000 E2E8E2D6 E4E34040 40404040 40404000 00000F40 (LIT+64) 80000000 0025C000 01400008 08000000 00088000 00000040 C0000140 00080800 (LIT+96) 00000008 02400008 08000000 0008 INITIALIZE MVI 0(9),X'40' (BLW=0)+0 MVC 1(3,9),56(10) (BLW=0)+1 PGMLIT AT +52 LA 2,0(0,0) ST 2,4(0,9) (BLW=0)+4 L 2,56(0,10) PGMLIT AT +52 ST 2,8(0,9) (BLW=0)+8 ST 2,12(0,9) (BLW=0)+12 MVC 16(7,9),56(10) (BLW=0)+16 PGMLIT AT +52 MVI 23(9),X'40' (BLW=0)+23 MVC 24(6,9),56(10) (BLW=0)+24 PGMLIT AT +52 MVC 30(6,9),56(10) (BLW=0)+30 PGMLIT AT +52 LA 2,0(0,0) ST 2,3116(0,8) (BLW=1)+3116 L 2,56(0,10) PGMLIT AT +52 ST 2,3120(0,8) (BLW=1)+3120 ST 2,3124(0,8) (BLW=1)+3124 MVC 3128(7,8),56(10) (BLW=1)+3128 PGMLIT AT +52 MVI 3135(8),X'40' (BLW=1)+3135 MVC 3136(6,8),56(10) (BLW=1)+3136 PGMLIT AT +52 MVC 3142(6,8),56(10) (BLW=1)+3142 PGMLIT AT +52 LA 1,0(0,9) TBL-ENTRY-FLG() MVC 544(4,13),63(10) TS2=0 PGMLIT AT +59 GN=8 EQU * --------------+ MVC 0(12,1),0(9) TBL-ENTRY-FLG() | LA 1,12(0,1) | LA 0,300(0,0) | GN=9 EQU * ----+ | MVC 0(24,1),12(9) TBL-SHCD-DATSBT() | | LA 1,24(0,1) | 300回 | BCT 0,172(0,11) GN=9(0001D4) ----+ | MVC 0(8,1),3116(8) TBL-KSHCD-RECLEN() | LA 1,8(0,1) | 15回 LA 0,300(0,0) | GN=10 EQU * ----+ | MVC 0(24,1),3124(8) TBL-KSHCD-DATSBT() | 300回 | LA 1,24(0,1) | | BCT 0,200(0,11) GN=10(0001F0) ----+ | L 2,544(0,13) TS2=0 | SH 2,6(0,10) PGMLIT AT +2 | ST 2,544(0,13) TS2=0 | BC 7,158(0,11) GN=8(0001C6) --------------+ - 2 -
2)大きいサイズの領域に対する INITIALIZE 命令 例えば、次の領域を INITIALIZE したとすると、 LINKAGE SECTION. 01 SUB-WAI04B15. BLL=0001+000 ****************************************************************** * RECORD NAME = WAI04B15 94/03/04 * レコード名称 = ジャ−ナル編集エリア引数 ****************************************************************** 05 IA04B15-EDTINF. BLL=0001+000,0000 10 IA04B15-JNLLEN BLL=0001+000,0000 PIC S9(00009) COMP. 10 IA04B15-OUTTYP BLL=0001+004,0000 PIC X(00003). 10 IA04B15-FWKSBS BLL=0001+007,0000 PIC X(00003). 10 FILLER BLL=0001+00A,0000 PIC X(00002). 05 IA04B15-HNSDAT. BLL=0001+00C,0000 10 IA04B15-JNLAREA BLL=0001+00C,0000 PIC X(28665). PROCEDURE DIVISION USING SUB-WAI04B15. INITIALIZE SUB-WAI04B15. この時の展開形は次のようになる (LIT+0) 40000001 00000001 00001000 6FF90004 D7E3C5E2 E3F0F4C1 40000000 00000000 (LIT+32) 00000001 34000000 09000000 00000000 00800000 00E2E8E2 D6E4E340 40404040 (LIT+64) 40800000 000025C0 00014000 08080000 00001480 00000000 40C00001 40000808 (LIT+96) 00000000 14024000 08080000 000014 INITIALIZE MVC 0(4,9),29(10) (BLL=1)+0 PGMLIT AT +25 MVC 4(3,9),65(10) (BLL=1)+4 PGMLIT AT +61 MVC 7(3,9),65(10) (BLL=1)+7 PGMLIT AT +61 LA 2,12(0,9) IA04B15-JNLAREA LH 3,16(0,10) PGMLIT AT +12 ---- 6FF9(16)バイト 約28K LA 4,28(0,10) PGMLIT AT +24 L 5,4(0,10) PGMLIT AT +0 MVCL 2,4 28KバイトのMVCL この用に CPU 使用量の多い 28キロバイト の MVCL 命令が展開されるため、この場合では本当に INITIALIZE が 必要な IA04B15-EDTINFのみを初期化するようにする。 - 3 -
2.サブプログラムとの受渡しを、領域からポインタへ 1)領域を使用頻度の高いサブプログラムに受け渡す時 WORKING-STORAGE SECTION. 01 SUB-WAI04012. ****************************************************************** * RECORD NAME = WAI04012 94/03/29 * レコード名称 = ジャ−ナル検索パラメ−タ引数 ****************************************************************** ・ ・ ・ 15 IA04012-KSKDAT-O PIC X(04096). 01 WK-WSJZBBB1. 15 FILLER PIC X(012). ****************************************************************** * RECORD NAME = WSJZBBB1 93/07/23 * レコード名称 = 貯金共通部 ****************************************************************** 15 受払金額 PIC S9(00013) COMP-3. 15 証書等発行金額 PIC S9(00013) COMP-3. 15 過不足表示 PIC S9(00002) COMP-3. 15 過不足金額 PIC S9(00013) COMP-3. 15 FILLER PIC X(00009). EVALUATE IA04012-DATSBT WHEN CNS-B1 MOVE IA04012-KSKDAT-O TO WK-WSJZBBB1 MOVE CNS-SWOFF TO SW-B1 WHEN OTHER CONTINUE END-EVALUATE. この展開は次のようになる EVALUATE WHEN CLC 29(4,8),90(9) IA04012-DATSBT CNS-B1 BC 7,92(0,11) GN=9(00017C) MOVE MVC 40(44,9),40(8) WK-WSJZBBB1 IA04012-KSKDAT-O MOVE MVI 96(9),X'F0' (BLW=1)+96 BC 15,92(0,11) GN=8(00017C) GN=9 EQU * WHEN CONTINUE GN=8 EQU * このプログラムを次のページのように変えると - 4 -
WORKING-STORAGE SECTION. 01 SUB-WAI04012. ****************************************************************** * RECORD NAME = WAI04012 94/10/27 * レコード名称 = ジャ−ナル検索パラメ−タ引数 ****************************************************************** ・ ・ ・ 15 IA04012-KSKDAT-O POINTER. LINKAGE SECTION. 01 WK-WSJZBBB1. 15 FILLER PIC X(012). ****************************************************************** * RECORD NAME = WSJZBBB1 93/07/23 * レコード名称 = 貯金共通部 ****************************************************************** 15 受払金額 PIC S9(00013) COMP-3. 15 証書等発行金額 PIC S9(00013) COMP-3. 15 過不足表示 PIC S9(00002) COMP-3. 15 過不足金額 PIC S9(00013) COMP-3. 15 FILLER PIC X(00009). EVALUATE IA04012-DATSBT WHEN CNS-B1 SET ADDRESS OF WK-WSJZBBB1 TO IA04012-KSKDAT-O MOVE CNS-SWOFF TO SW-B1 WHEN OTHER CONTINUE END-EVALUATE. この時の SET ADDRESS OF の展開は次のようになる SET L 2,40(0,9) IA04012-KSKDAT-O LA 2,0(0,2) ST 2,308(0,13) BLL=1 L 8,308(0,13) BLL=1 このように、CPU 使用量の多い MVC 命令が LOAD,LOAD ADDRESS,STORE命令に置き変わる。 実行ステップ数は増加するが CPU タイム は減少するためよく使用されるサブプログラムとの インターフェースである程度の長さ(数10バイト)以上のものはポインタ渡しにする。 - 5 -
2)メインプログラムから受け渡される領域のサイズが大きい時 (2−1)構造体渡しの時 WORKING-STORAGE SECTION. 01 INJNL. COPY WAF04A01. COPY WAF04A02. COPY WAF04A04. COPY WAF04A06. 03 WK-JNL PIC X(28360). LINKAGE SECTION. 01 SUB-WAI04A32. COPY WAI04A32. ・ ・ ・ 05 IA04A32-DEL-INJNL PIC X(28665). 05 IA04A32-DEL-EDJNL PIC X(28665). ・ ・ ・ PROCEDURE DIVISION USING SUB-WAI04A32. MOVE IA04A32-DEL-INJNL TO INJNL. この時の展開は次のようになる (LIT+0) 00006FF9 00000001 00001000 6FF80004 D7E3C5E2 E3F0F2C2 00000000 00000134 (LIT+32) 00000007 00000150 00000010 00000000 00000000 80000000 E2E8E2D6 E4E34040 (LIT+64) 40800000 000025C0 00014000 08080000 00001480 00000000 40C00001 40000808 (LIT+96) 00000000 14024000 08080000 000014 MOVE LA 2,0(0,8) INJNL LH 3,16(0,10) PGMLIT AT +12 ---- 6FF8(16) 約28K LA 4,20(0,9) IA04A32-DEL-INJNL L 5,4(0,10) PGMLIT AT +0 MVCL 2,4 ---- 28キロバイトの MVCL これを次のページの様にポインタ渡しにすると - 6 -
WORKING-STORAGE SECTION. LINKAGE SECTION. 01 INJNL. COPY WAF04A01. COPY WAF04A02. COPY WAF04A04. COPY WAF04A06. 03 WK-JNL PIC X(28360). 01 SUB-WAI04A32. COPY WAI04A32. ・ ・ ・ * 業務系ジャーナルレコード入力域 05 IA04A32-DEL-INJNL-P POINTER. * コード変換後ジャーナルレコード編集エリア 05 IA04A32-DEL-EDJNL-P POINTER. ・ ・ ・ PROCEDURE DIVISION USING SUB-WAI04A32. SET ADDRESS OF INJNL TO IA04A32-DEL-INJNL-P この展開は次のようになり (LIT+0) 00001000 00000001 0004D7E3 C5E2E3F0 F2C10000 00000000 00000000 012C0000 (LIT+32) 00090000 00000000 00008000 0000E2E8 E2D6E4E3 40404080 00000000 25C00001 (LIT+64) 40000808 00000000 0E800000 000040C0 00014000 08080000 00000E02 40000808 (LIT+96) 00000000 0E SET L 1,20(0,9) IA04A32-DEL-INJNL-P IA04A32-DEL-INJNL-P LA 1,0(0,1) ST 1,308(0,13) BLL=2 BLL=2 L 8,308(0,13) BLL=2 BLL=2 LA 15,6(0,0) LA 14,308(0,13) BLL=2 BLL=2 GN=8 EQU * ----+ AL 1,4(0,10) PGMLIT AT +0 PGMLIT AT +0 | 6回 AH 14,12(0,10) PGMLIT AT +8 PGMLIT AT +8 | 4キロバイトずつ ST 1,0(0,14) | ベースアドレスを BCT 15,78(0,11) GN=8(00017C) GN=8(00017C) ----+ 設定している このように実行ステップ数は増加するが、CPU 使用量の多い MVCL 命令が LOAD,LOAD ADDRESS,STORE 等 CPU 使用量の少ない命令に置き変わるため CPU タイム は減少する - 7 -
(2−2)領域渡しの時 WORKING-STORAGE SECTION. 01 WK-JNL-REC. BLW=0000+000 03 WK-SHIKI-REC. BLW=0000+000,00 COPY WAF04A01. 03 WK-GCOM-REC. BLW=0000+008,00 COPY WAF04A02. 03 WK-JCOM-REC. BLW=0000+088,00 COPY WAF04A04. 03 WK-UCOM-REC. BLW=0000+0B4,00 COPY WAF04A06. 03 WK-JNL PIC X(28361). BLW=0000+130,00 LINKAGE SECTION. 01 JNL-ED-AREA PIC X(28665). BLL=0001+000 PROCEDURE DIVISION USING JNL-ED-AREA. MOVE JNL-ED-AREA TO WK-JNL-REC. この展開は次のようになる MOVE LA 2,0(0,8) WK-JNL-REC LH 3,6(0,10) PGMLIT AT +2 LA 4,0(0,9) JNL-ED-AREA L 5,4(0,10) PGMLIT AT +0 MVCL 2,4 ---- 28キロバイトのMVCL これを次のように変えると WORKING-STORAGE SECTION. LINKAGE SECTION. 01 JNL-ED-AREA PIC X(28665). BLL=0001+000 01 WK-JNL-REC. BLL=0008+000 03 WK-SHIKI-REC. BLL=0008+000,00 COPY WAF04A01. COPY WAF04A02. 03 WK-JCOM-REC. BLL=0008+088,00 COPY WAF04A04. 03 WK-UCOM-REC. BLL=0008+0B4,00 COPY WAF04A06. 03 WK-JNL PIC X(28361). BLL=0008+130,00 PROCEDURE DIVISION USING JNL-ED-AREA. SET ADDRESS OF WK-JNL-REC TO ADDRESS OF JNL-ED-AREA. - 8 -
展開は次のようになる SET LA 1,0(0,9) JNL-ED-AREA ST 1,332(0,13) BLL=8 L 8,332(0,13) BLL=8 LA 15,6(0,0) LA 14,332(0,13) BLL=8 GN=9 EQU * ----+ AL 1,8(0,10) PGMLIT AT +4 | 6回 AH 14,12(0,10) PGMLIT AT +8 | 4キロバイトずつ ST 1,0(0,14) | ベースアドレスを BCT 15,122(0,11) GN=9(000190) ----+ 設定している この場合も実行ステップ数は増加するが、CPU 使用量の多い MVCL 命令が LOAD,LOAD ADDRESS,STORE命令等 に置き変わるため CPU タイム は減少する - 9 - 次のページ 索引に戻る ホームページに戻る