雨谷の日和

過去20年で2,700を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

Cでのバッファリングの注意点

昨日「Cでのバッファリングの効果が見られなかった」という主旨のことを書いたところ、早速jzkey氏からご指摘頂きました。有難うございます。
早速、調べてみました。
 →参考:「Manpage of SETBUF
以下、頂いた3点の指摘について個別に書きます。

1) Cのstdioではデフォルトでバッファリングが有効であるとおもいますよ。

ご指摘の通りでした。stdioでのデフォルトは、バッファリング有になるようです。

2) BUFSIZを超えた領域をsetbufしても意味がないと思いますよ。

これはちょっと良く分かりませんでした。
ちなみに今回の環境では、BUFSIZ = 1024 でした。
前回、バッファのサイズを8192 にしたのは、JavaのBufferedOutputStreamのバッファのデフォルトサイズがそうなっているという理由からでした。
ただ確かにCの場合、バッファサイズを1024 にしても、約5秒という結果に変わりはありませんでした。
Javaの場合はバッファサイズを1024 にすると若干、速度低下が見られました。
訂正(2004.03.21):setbufの場合、バッファサイズを表す引数としてBUFSIZが渡されるので、バッファ領域をいくら大きく取っても、BUFSIZの大きさまでしか使われません。従って、jzkey氏の指摘は妥当です。BUFSIZより大きなサイズのバッファを使いたい場合には、setvbufを使う必要があります。ただ今回の測定では、setvbufを使って測定しても、バッファサイズが1024の場合と8192の場合では差が出ませんでした。

3) STDIOレベルのバッファリングでは、改行で暗黙にフラッシュする実装が多いですよ。

CUI 端末の表示出力用などのために、行単位のバッファリングがあるようですね。ただ、setbuf のデフォルトの動作では、フルバッファリングになるようです。
ちなみに、setvbuf で行単位のバッファリングを指定して測定してみたところ、約17秒という結果になりました。最適化の効果は見られませんでした。


ということで、今まで測ってきたCの出力処理の処理時間はバッファリング有(フルバッファリング)の場合だったようなので、今度はバッファリング無しの場合を測ってみたいと思います。