C/400

36. 関数の呼び出しの高速化

C言語においてサービス・プログラム (*SRVPGM) で EXPORT されている関数は上位の *PGM
などで頻繁に呼び出して使用される。
あるいは自分自身の内部で使用する関数を頻繁に呼び出す場合もあるのではないだろうか?
例えば CGI では EBCDIC/ASCII 変換の変換関数は度々呼び出されて使用される。
C言語が、速いとは言え、関数といえども名前によって呼び出されるのであるから
内部ではいわゆる「名前解決」が行われてオーバーヘッドの要因となっているはずである。
これを名前によって呼び出すのではなくポインターによって関数を呼び出すようにすれば
繰り返し呼び出す関数の実行には、パフォーマンスを改善して高速化を図ることができる。
関数の呼び出しをポインターによる呼び出しに変更するのは比較的、簡単である。

#pragma inline(関数名)

を定義するだけでよい。

#pragma inline(toASCII)
int toASCII(char* ascbuf, char* ebcbuf, char table[10], char tbllib[10])
  :

のようにして inline を定義する。#pragma inline はソース中のどこに記述してもよい。
ただしコンパイルのときには

最適化:30 以上
インライン・オプション:*ON

を指定する必要がある。
関数の呼び出しは通常のものと何ら変更する必要がない。
これだけのことで関数の呼び出しはかなり速くする。

【 参考 】

EnterpriseServer Ver4.0 の RPGエンジン4 の配下で動作している、すべての *SRVPGM
ほとんどがポインターによる呼び出しを行って、高速化が図られている。