Article freyasx/23 of [1-110] on the server localhost:119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A22@freyasx.ML_>]
Newsgroups: mail-lists.freyasx

[FreyaSX] Re: FreyaSX-0.99.3 リリース (CGI検索出力の安定化)
21 Aug 2004 15:53:36 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project


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/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V