2

私はファイル全体を読み取るプログラムを作成しましたfgetc

while ((c = fgetc(f)) != EOF) { ... }

しかし、プログラムは遅すぎます。に変更fgetcしたときfread

static unsigned char buf[4096];

while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { ... }

プログラムは約10倍速く動作します。

なんで?私が知っているようにfgetc、バッファリングされた関数なので、明示的なバッファを備えた2番目のバージョンと同じくらい速く動作するはずですよね?

4

2 に答える 2

11

あなたは店の近くに住んでいます。あなたは100缶のスープを手に入れる必要があります。どちらがより効率的ですか、店舗への100回の旅行で毎回1缶を取得するか、店舗への1回の旅行で100缶を取得しますか?各トリップには時間がかかるオーバーヘッドがあるため、明らかに1トリップです。

fgetcの場合、さまざまな種類のオーバーヘッドがあります。

  • 関数呼び出し
  • ファイルは開いていますか?
  • ファイルの終わりに?
  • バッファは空ですか?
  • ロック

これらのことは、すべてのスープに対して1回、または缶ごとに1回実行できます。個々のオーバーヘッドの各ビットは小さいですが、何度も繰り返されると、合計が重要になります。

于 2012-11-04T18:39:17.770 に答える
5

fgetcを使用すると、より多くの関数呼び出しを取得できるだけでなく(それぞれにオーバーヘッドがあります)、fgetcはマルチスレッドアプリケーションでロックを取得することもあります(これは、たとえばPOSIXによって義務付けられています)。

于 2012-11-04T17:47:31.897 に答える