C/400

18. C/400 における究極の読み取り高速化テクニック

これまでの学習で C/400で iSeries400のデータ・ベースの読み取りの方法につていは
理解して頂けたものと思う。
C 言語は C言語が使えるプラット・フォームでは 最も高速に動作する。
C/400で大量のデータ・ベースを処理すればこれまでよりかなり速くなるであろうと
期待するのも当然である。
いきなり期待を裏切るわけではないが、実際、C/400で大量のデータ・ベースの読み取りを
行ってみれば驚くことがある。
なんと C/400の読み取りのほうが RPGより遅いのである!
OS/400も C/400で書かれているはずなのだから C/400が RPGより速くて当然なのではないだろうかと
思われるのも無理はない。
実は iSeries400におけるレコードの読み取りは、OS/400にレコードの読み取りを指示すると一旦、
OS/400がシステム・バッファーに読み取ってそれをプログラムのバッファーに送出する
という仕組みになっている。
RPG のバッファーや C/400のバッファーに送出するのだがこれが遅さの原因になっている。
ところが C/400では自分の読み取りバッファーには入れないでシステム・バッファーを
直接読み取ることができる。
このようにシステム・バッファーの読み取りに変更すると、C/400の読み取り速度は余計なI/Oが無い分、
格段に速くなり、RPGの読み取り速度の 150% 以上の速度で処理される。
この手法は EnterpriseServer の DB2エンジンに採用されている。
特に効果を発揮するのは WebScript の部分である。どのようにユーザーが RPGを組んだところで必ず
EnterpriseServer のデータ・ベース読み取りのほうが速いと断言できるのはこの原理にある。

それではその手法を紹介しよう。
これまでであれば

iofb = _Rreadn(fp, record, MAX_LEN, __DFT);

のようにして レコードの読み取りバッファーを record に入れるように指示してきたが、これを

iofb = _Rreadn(fp, NULL, MAX_LEN, __DFT);

のように書き換えて NULL の指定によってレコード・バッファーの読み取りを拒否する。
しかし、この直後には

memset(record, 0, sizeof(record));                     
memcpy(record, (char*)(*(fp->in_buf)), fp->buf_length);
recordf[fp->buf_length] = 0x00;   

によって自分でシステム・バッファーを直接、読んで record に入れるのである。
これによって C/400の読み取り速度はやはり RPG よりも圧倒的に速くなる。