为什么fgetc太慢了?

时间:2012-11-04 17:42:32

标签: c

我编写了一个程序,通过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 个答案:

答案 0 :(得分:11)

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

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

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

对于所有的汤,这些东西可以做一次,或者每次可以做一次。单独地,每个开销位都很小,但是当重复多次时,总和变得很重要。

答案 1 :(得分:5)

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

相关问题