问题在于fgetc现代 C 实现支持线程。AFILE可以由多个线程共享,这就是为什么对缓冲区的访问需要显式锁定。虽然您可以使用 扩大缓冲区setbuf,但它并不能消除锁定的需要。因此,一次fread调用几乎总是比多次调用性能更高fgetc。
任何setbuf设置对性能的影响都是有限的。要从缓冲流中一次读取一个字符,您可以使用 POSIX 标准flockfile/ funlockfile,并且getc_unlocked当文件为您的线程锁定时。
但即便如此,fread它也很可能比多次调用性能更高getc_unlocked,因为它已针对读取块进行了优化。