C400

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 よりも圧倒的に速くなる。