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/funlockfilegetc_unlocked 当文件为您的线程锁定时。

但即便如此,fread 很可能比多个 getc_unlocked 调用更高效,因为它已经过优化以读取