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 -
次のページ 索引に戻る ホームページに戻る