C/400

60. パフォーマンスの改善に効果的な strstr の使用方法

文字ストリングの検索において strstr 関数は頻繁に使用されることが多い。
例えば、

char* tmpbuf;
char* ptr;
int   pos;

ptr = strstr(tmpbuf, "<REPORT ");
if(ptr != NULL){
  pos = (int)(ptr - pos);
}

という具合である。
ところが、この tmpbuf の大きさが結構、巨大である場合にこの strstr が頻繁に演算として
繰り返し行われる場合では strstr によるオーバーヘッドが馬鹿にはならない。

EnterpriseServer での SFL 型の明細行を数多く、挿入する場合にも
一行文を最後の行に挿入してから、最後に追加された一行分へのフィールド値の更新が
行われる。

<行 = 1 の明細行 ............................... >
<行 = 2 の明細行 ............................... >
     :
<行 = N の明細行 ............................... >

この全体のバッファーが tmpbuf という名前の作業用のバッファーであり
出力すべき HTML のイメージである。
従来では第N行めのレコードを追加した後で毎回、tmpbuf の先頭より
今、追加した第N行めのレコードを strstr 関数によって探しに行く作業を行っていた。
今回の改訂では、
第N行めの明細行を追加した位置 strrep を覚えておいて

ptr = strstr(&tmpbuf[strrep], "<REPORT ");

のようにして最短距離から探しに行くように改訂したところ何と全体の出力の
パフォーマンスは 4倍以上 に向上して速くなった。
少々の大きなデータの表示でも、一瞬にして明細が表示されるようになったのである。
従来でも EnterpriseServer が採用される最も大きな要因がパフォーマンスの良さであった。
しかし今回の改訂では、我々開発者全員が驚くほどの速度向上を図ることができた。
パフォーマンスの向上はこれからも弛まない研究が行われていくことになるだろう。