fgetc 与 fread 哪个更有效?

Hel*_*rld 1 c assembly dos x86-16

我想将一个文件的内容复制到另一个文件。

最初我认为这fgetc()会更好,fread()因为程序不需要重复通过缓冲区来复制每个字符。

但我很快意识到,重复使用fgetc()相当于执行多个函数调用(堆栈指针),这样在大文件的情况下会使过程更加耗时。

哪个更有效率?

size_t _Cdecl fread(void *__ptr, size_t __size, size_t __n, FILE *__stream);

int _Cdecl fgetc(FILE *__stream);

Ant*_*ala 5

问题在于fgetc现代 C 实现支持线程。AFILE可以由多个线程共享,这就是为什么对缓冲区的访问需要显式锁定。虽然您可以使用 扩大缓冲区setbuf,但它并不能消除锁定的需要。因此,一次fread调用几乎总是比多次调用性能更高fgetc

任何setbuf设置对性能的影响都是有限的。要从缓冲流中一次读取一个字符,您可以使用 POSIX 标准flockfile/ funlockfile,并且getc_unlocked当文件为您的线程锁定时。

但即便如此,fread它也很可能比多次调用性能更高getc_unlocked,因为它已针对读取进行了优化。

  • @HelloWorld是的,内存映射IO,但不是在DOS中。**在 DOS 下没有任何作用**。 (3认同)
  • @HelloWorld 这是一个功能。在提出大量问题之前,请先尝试自己寻找解决方案。另外,根据您的知识水平,首先阅读一本有关 C 语言编程的书可能是个好主意,因为您似乎对事物的工作原理有一些奇怪的先入之见。 (3认同)