- ベストアンサー
stdioがキャッシュしてくれるから高速だという話
stdioがキャッシュしてくれるから高速だという話で open read write close だと遅かったのが、stdioを使って fopen fgetc putc fclose にすると、readを使われる回数が減っていることがstraceで確認できるらしいのです。 fgetcが最初に1バイト取ってくる時、実際の処理はreadで何千バイトも読んでキャッシュしていて、そのキャッシュから1バイトずつ読み込んで、キャッシュの終端まで読まれたらreadでまた何千バイトも読むということなんですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 僕の考えが大筋正解なら、後者はfor()で1バイトずつバッファリングデータからの読み込みをしているということですか? そう考えて構いません。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
回答No.1
キャッシュというよりバッファリングの話ですね。 > fgetcが最初に1バイト取ってくる時、実際の処理はreadで何千バイトも読んでキャッシュしていて、そのキャッシュから1バイトずつ読み込んで、キャッシュの終端まで読まれたらreadでまた何千バイトも読むということなんですか? 大筋では間違っていませんが、正確には少し違います。 まず、標準ストリームが実際にバッファリングされるかどうかは処理系に依存します。 また、バッファリングされるとしても、状況によってフルバッファリングされるか行バッファリングされるかも異なりますし、デフォルトのバッファサイズは<stdio.h>で定義されるBUFSIZになります。 さらに、setbufやsetvbufによってバッファリングの仕方を変更することも可能です。
補足
バッファリングだったかもしれません。 本に載っていたことなんですが、どの本だったか忘れてしまいました。 たしか open() for(;;){ read(1) rwite() > stdout } cose() と fopen() for(;;){ fgetc() putc() } fclose のような2つの実行ファイルを作って実行させて、実行された時の様子をstraceしてみたら、前者はreadが数回だったのに後者はreadが1回だったという内容でした。 僕の考えが大筋正解なら、後者はfor()で1バイトずつバッファリングデータからの読み込みをしているということですか?