fgetc 与 fread 哪个更有效?
Which is more efficient fgetc vs fread?
我想将一个文件的内容复制到另一个文件。
最初我认为 fgetc()
会比 fread()
好,因为程序不需要通过缓冲区重复复制每个字符。
但我很快意识到,重复使用 fgetc()
等同于进行多次函数调用(堆栈指针),因此在大文件的情况下,这会使过程更加耗时。
哪个效率更高?
size_t _Cdecl fread(void *__ptr, size_t __size, size_t __n,
FILE *__stream);
对
int _Cdecl fgetc(FILE *__stream);
fgetc
的问题是现代 C 实现支持 线程。 FILE
可以由多个线程共享,这就是为什么对缓冲区的访问需要显式锁定。虽然您可以使用 setbuf
扩大缓冲区,但这并不能消除锁定的需要。因此,fread
调用几乎总是比多个 fgetc
调用更高效。
任何 setbuf
设置对性能的影响有限。要一次从缓冲流中读取单个字符,您可以使用 POSIX 标准 flockfile
/funlockfile
和 getc_unlocked
当文件为您的线程锁定时。
但即便如此,fread
很可能比多个 getc_unlocked
调用更高效,因为它已经过优化以读取 块。
我想将一个文件的内容复制到另一个文件。
最初我认为 fgetc()
会比 fread()
好,因为程序不需要通过缓冲区重复复制每个字符。
但我很快意识到,重复使用 fgetc()
等同于进行多次函数调用(堆栈指针),因此在大文件的情况下,这会使过程更加耗时。
哪个效率更高?
size_t _Cdecl fread(void *__ptr, size_t __size, size_t __n,
FILE *__stream);
对
int _Cdecl fgetc(FILE *__stream);
fgetc
的问题是现代 C 实现支持 线程。 FILE
可以由多个线程共享,这就是为什么对缓冲区的访问需要显式锁定。虽然您可以使用 setbuf
扩大缓冲区,但这并不能消除锁定的需要。因此,fread
调用几乎总是比多个 fgetc
调用更高效。
任何 setbuf
设置对性能的影响有限。要一次从缓冲流中读取单个字符,您可以使用 POSIX 标准 flockfile
/funlockfile
和 getc_unlocked
当文件为您的线程锁定时。
但即便如此,fread
很可能比多个 getc_unlocked
调用更高效,因为它已经过优化以读取 块。