文字ストリングの検索において strstr
関数は頻繁に使用されることが多い。
例えば、
char* tmpbuf; char* ptr; int pos; ptr = strstr(tmpbuf, "<REPORT "); if(ptr != NULL){ pos = (int)(ptr - pos); }
という具合である。
ところが、この tmpbuf
の大きさが結構、巨大である場合にこの strstr が頻繁に演算として
繰り返し行われる場合では strstr によるオーバーヘッドが馬鹿にはならない。
EnterpriseServer での SFL 型の明細行を数多く、挿入する場合にも
この全体のバッファーが tmpbuf という名前の作業用のバッファーであり
のようにして最短距離から探しに行くように改訂したところ何と全体の出力の
一行文を最後の行に挿入してから、最後に追加された一行分へのフィールド値の更新が
行われる。
<行 = 1 の明細行 ............................... >
<行 = 2 の明細行 ............................... >
:
<行 = N の明細行 ............................... >
出力すべき HTML のイメージである。
従来では第N行めのレコードを追加した後で毎回、tmpbuf の先頭より
今、追加した第N行めのレコードを strstr 関数によって探しに行く作業を行っていた。
今回の改訂では、
第N行めの明細行を追加した位置 strrep
を覚えておいて
ptr = strstr(&tmpbuf[strrep], "<REPORT ");
パフォーマンスは 4倍以上 に向上して速くなった。
少々の大きなデータの表示でも、一瞬にして明細が表示されるようになったのである。
従来でも EnterpriseServer が採用される最も大きな要因がパフォーマンスの良さであった。
しかし今回の改訂では、我々開発者全員が驚くほどの速度向上を図ることができた。
パフォーマンスの向上はこれからも弛まない研究が行われていくことになるだろう。