我希望编写一个高效的C程序,它可以复制一个文件。似乎不是一个执行此操作的函数(例如rename)。我打算在stdio.h中使用fscanf和fprintf,但是他们的描述没有说明它们是如何被缓冲的。它们是否在不同的缓存级别之间缓冲? (我假设磁盘到内存缓冲区由操作系统处理)
答案 0 :(得分:1)
当您使用fopen
打开文件时,它将完全缓冲。
您可以在使用setvbuf
(reference)对文件执行任何其他操作之前更改缓冲。
使用FILE
对象上的任何普通I / O函数都将利用缓冲。
如果您只是复制数据,那么您将进行顺序读取和写入,并且不一定需要缓冲。但有效地做到这一点需要为I / O操作选择合适的块大小。传统上,这与磁盘扇区的大小(4096字节)有关,但该值不是面向未来的。 fopen
使用的默认值为BUFSIZ
。
与任何优化一样,构建实际测试以验证您的性能增益(或损失)。
最后,对于速度最快的I / O,您可能必须使用特定于操作系统的API。 C I / O函数只是映射到这些API的一般情况,但是可能存在无法通过C库控制的OS的特殊性能设置。在为Windows编写快速AVI编写器时,我当然遇到了这个问题。使用特定于平台的I / OI能够实现磁盘的最大读/写速度:缓冲I / O(<stdio.h>
)或本机AVI API速度的两倍,比传统C快约20%无缓冲的I / O.
答案 1 :(得分:0)
printf
和scanf
系列函数都是同一缓冲“接口”的一部分。 man 3 stdio
:
标准I / O库提供简单而有效的缓冲 流I / O接口。输入和输出映射到逻辑数据 流和物理I / O特性被隐藏。该 功能和宏列在下面;更多信息是 可从个人手册页获得。
如果您想避免缓冲,则必须使用不同的C库。