我编写了一个程序,通过fgetc
读取整个文件:
while ((c = fgetc(f)) != EOF) { ... }
但程序太慢了。当我将fgetc
更改为fread
时,
static unsigned char buf[4096];
while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { ... }
该程序可以更快地 10次。
为什么呢?据我所知,fgetc
是一个缓冲函数,所以它应该像第二个版本一样快,带有显式缓冲区,不是吗?
答案 0 :(得分:11)
你住在商店附近。你需要得到100罐汤。哪个更有效率,100次到商店获得1次可以每次或1次到商店获得100罐?显然是1次旅行,因为每次旅行都有花费时间的开销。
在fgetc的情况下,有各种开销。
对于所有的汤,这些东西可以做一次,或者每次可以做一次。单独地,每个开销位都很小,但是当重复多次时,总和变得很重要。
答案 1 :(得分:5)
使用fgetc,你不仅可以获得更多的函数调用(每个函数都有其开销),但是fgetc也可以在多线程应用程序中获取锁定(例如POSIX强制要求)。