• ベストアンサー

stdioがキャッシュしてくれるから高速だという話

stdioがキャッシュしてくれるから高速だという話で open read write close だと遅かったのが、stdioを使って fopen fgetc putc fclose にすると、readを使われる回数が減っていることがstraceで確認できるらしいのです。 fgetcが最初に1バイト取ってくる時、実際の処理はreadで何千バイトも読んでキャッシュしていて、そのキャッシュから1バイトずつ読み込んで、キャッシュの終端まで読まれたらreadでまた何千バイトも読むということなんですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 僕の考えが大筋正解なら、後者はfor()で1バイトずつバッファリングデータからの読み込みをしているということですか? そう考えて構いません。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

キャッシュというよりバッファリングの話ですね。 > fgetcが最初に1バイト取ってくる時、実際の処理はreadで何千バイトも読んでキャッシュしていて、そのキャッシュから1バイトずつ読み込んで、キャッシュの終端まで読まれたらreadでまた何千バイトも読むということなんですか? 大筋では間違っていませんが、正確には少し違います。 まず、標準ストリームが実際にバッファリングされるかどうかは処理系に依存します。 また、バッファリングされるとしても、状況によってフルバッファリングされるか行バッファリングされるかも異なりますし、デフォルトのバッファサイズは<stdio.h>で定義されるBUFSIZになります。 さらに、setbufやsetvbufによってバッファリングの仕方を変更することも可能です。

sutghe
質問者

補足

バッファリングだったかもしれません。 本に載っていたことなんですが、どの本だったか忘れてしまいました。 たしか open() for(;;){  read(1)  rwite() > stdout } cose() と fopen() for(;;){  fgetc()  putc() } fclose のような2つの実行ファイルを作って実行させて、実行された時の様子をstraceしてみたら、前者はreadが数回だったのに後者はreadが1回だったという内容でした。 僕の考えが大筋正解なら、後者はfor()で1バイトずつバッファリングデータからの読み込みをしているということですか?