[Reference:<_A22@freyasx.ML_>]
Newsgroups: mail-lists.freyasx
[FreyaSX] Re: FreyaSX-0.99.3 リリース (CGI検索出力の安定化)
0.99.3 をリリースしました。
今回はCGI検索の出力の安定化・高速化を行いました。といっても、高速化という
のはおそらく、gcc 3.X 系だけの問題です。
gcc 3.Xからは、cout への出力が異常に遅いようで、どうやらそれはデフォルト
でバッファリングが抑制されているためらしく、FreyaSX でも 0.95 から
std::ios::sync_with_stdio(false) というおまじないをしています。
特に fsearch.cgi では、検索結果の出力を cout へ直接書き出しているのですが、
cout の出力先がパイプとかソケットとかだと特に遅くなるようで、sync を止める
おまじないの効果は大ではあるものの、バッファが小さいのか、まだひっかかりが
あります。
それで試しに、検索結果を直接出力するのは止めて、一旦 stringstream に
書き出し、main() の最後にそれを stdout に書き出すというふうにしてみたら、
ひっかかりがなくなったようです。
あわせて、出力前に出力データの文字コードを判別してからHTTPヘッダ
(Content-Typeのcharset)を設定して送出できるようになりました。
もとの実装であった ostream cout への書き出し先を単に stringstream に変更
するだけなので、変更は最小限で済みました。
しかしそれにしても、ちょっと古めの stringstream の実装はどうもあやしくて。
(RedHat7.1に同梱のやつ)seekg()とかget()とか全然動かないし。かといって
str().c_str() を直接さわると、新しめのgccでやたら実行が遅くなっちゃうし。
結局 tellg()<0 なら古めのやつと判別してc_str()を使うことにしましたが。
stringstream は大変便利なもんだと思う(自分でもCでMIME用のエンコーダ書いた
時にprintf関係をメモリ上でやりとりする関数を作って使ってます)ので、
もちょっと実装が安定・高速化して欲しいもんです。そうしたら逐次追加拡張
する valueSet も置き換えても良いかも。
D G
┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)
|