From: Masaki Fukushima Date: 1999-09-13T23:09:55+09:00 Subject: [ruby-dev:7840] socket and buffering 福嶋です。 gtkとsocketの問題を調べていて気づいたんですが、ruby の socket か らの読み込みって、全くバッファリングされないんですね。 したがって、sysread以外の入力メソッドを使うと全部 1 byte ずつ read システムコールが発行されてしまうと。 stdioを経由で、ブロックせずに読み込むにはそれしかないからだと思い ますけど。 これって、socketを使ったスクリプトの性能に結構影響あると思うんで すが、「必要ならsysreadを使いなさい」ということは周知されているん でしょうか? 特にネットワークがボトルネックでない場合(LANやlocalhost)に影響が 顕著であるように思います。 例えば ftplib を使って大きなファイルをgetすると、localhostからで もかなり遅くなってしまいます。 # もっとも、これは ftplib を sysread を使うように改良すれば回避で # きますが。 あと、Socket#read (IOから継承) を使うと fread の所でインタプリタ が止ってしまうことがありませんか? 例えば 1 バイトだけデータが到着しているソケットに aSocket.read(2) とかやると、fread で 2byte 読み込もうとしてブロックしてしまいます。 --- 福嶋正機