2

我编写了一个程序,它通过以下方式读取整个文件fgetc

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

但是程序太慢了。当我更改fgetcfread

static unsigned char buf[4096];

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

该程序的运行速度提高了大约10 倍

为什么?据我所知,fgetc它是一个缓冲函数,所以它应该与带有显式缓冲区的第二个版本一样快,不是吗?

4

2 回答 2

11

你住在商店附近。你需要得到100罐汤。100次到店每次1罐还是1次到店100罐哪个效率更高?显然是 1 次旅行,因为每次旅行都有需要时间的开销。

在 fgetc 的情况下,有各种开销。

  • 函数调用
  • 文件是否打开?
  • 在文件末尾?
  • 缓冲区是空的吗?
  • 锁定
  • 等等

这些事情可以为所有的汤做一次,或者每罐做一次。单独的每一位开销都很小,但是当重复多次时,总和变得很重要。

于 2012-11-04T18:39:17.770 回答
5

使用 fgetc,您不仅可以获得更多的函数调用(每个函数都有其开销),而且 fgetc 还可以在多线程应用程序中获取锁(例如,这是 POSIX 强制要求的)。

于 2012-11-04T17:47:31.897 回答