RPG

100. プロシージャーの呼び出しの高速化

永年、RPGに携わっているとフィールド名やサブ・ルーチン名を定義したり使用していると、
内部でどのようにメモリをアクセスしているのかを疑問に感じることもないであろうが
「名前」を定義して名前を使ってプロシージャーなどを呼び出すと、内部ではプロシージャーの
名前によってプロシージャーの始まりのアドレスが検索される。
アドレスが検索されて始めて実行が可能となるのであるが、このような内部作業のことを
「名前解決」と呼ぶ。

ILE で多くのプロシージャーを繰り返し呼び出して使用しているとこの「名前解決」の作業の
オーバー・ヘツドが馬鹿にならない場合がある。
プロシージャーを名前によって呼び出すのではなく、ポインターによって呼び出すようにすれば
名前解決の作業がなくなるので全体としてパフォーマンスを向上させることができる。
通常の処理では問題にならない場合でも高速化が要求されるようなソフトウェア・パッケージや
大量処理を行う場合はポインターによるプロシージャーを呼び出すように変更する価値はある。

【例1】名前によるプロシージャー・プロトタイプの宣言
D*( OVRDBF  のプロトタイプ宣言 ) 
D OVRDBF          PR                  ExtProc('OVRDBF')   
D  FILE                         10A   Value                 
D  TOFILE                       10A   Value                 
D  TOLIB                        10A   Value
【例2】ポインターによるプロシージャー・プロトタイプ宣言
D*( OVRDBF  のプロトタイプ宣言 ) 
D OVRDBF          PR                  ExtProc(OVRDBF_PTR)   
D  FILE                         10A   Value                 
D  TOFILE                       10A   Value                 
D  TOLIB                        10A   Value                 
D OVRDBF_PTR      S               *   PROCPTR               
D                                     INZ(%PADDR('OVRDBF')) 
【 解説 】

これは「OVRDBF」という名前のプロシージャーのプロトタイプ宣言であるが
名前による呼び出しであれば Extproc('OVRDBF') と宣言されているが
ポインターによる呼び出しの場合はExtProc(OVRDBF_PTR) として
OVRDBF_PTR というポインターによる呼び出しであることを宣言している。

ポインター OVRDBF_PTRINZ(%PADDR('OVRDBF') によって OVRDBF という
プロシージャーのポインターであることが定義されている。
例1、例2のどちらの場合であってもプロシージャーの利用は

CALLP OVRDBF

として同じ方法で呼び出すことができる。

【 参考 】

EnterpriseServer Ver4.0 ではユーザーが使用するプロシージャーの定義だけでなく
内部で使用されている関数の呼び出しのほとんどがポインターによる呼び出しによって
高速化が図られている。
多くのプロシージャーを利用している場合はボインターによる呼び出しをお勧めする。