我希望编写一个高效的 C 程序来创建文件的副本。似乎没有一个函数(例如 rename )执行此操作。我打算使用fscanf一个fprintf在 stdio.h 中,但它们的描述没有说明如何或是否缓冲它们。它们是否在不同的缓存级别之间进行缓冲? (我假设磁盘到内存缓冲区由操作系统处理)
最佳答案
当您使用 fopen
打开文件时,它将被完全缓冲。
您可以在对文件执行任何其他操作之前更改缓冲,使用 setvbuf
(reference)。
在 FILE
上使用任何正常的 I/O 功能对象将利用缓冲。
如果您只是复制数据,您将进行顺序读取和写入,并且不一定需要缓冲。但有效地做到这一点确实需要为 I/O 操作选择合适的 block 大小。传统上,这与磁盘扇区的大小(4096 字节)有关,但该值不是面向 future 的。 fopen
使用的默认值是 BUFSIZ
.
与任何优化一样,构建实际测试来验证您的性能增益(或损失)。
最后,为了获得最快的 I/O,您可能必须使用特定于操作系统的 API。 C I/O 函数仅映射到这些 API 的一般情况,但可能存在无法通过 C 库控制的操作系统的特殊性能设置。我在为 Windows 编写快速 AVI 编写器时确实遇到了这个问题。使用特定于平台的 I/O,我能够实现磁盘的最大读/写速度:是缓冲 I/O ( <stdio.h>
) 或 native AVI API 速度的两倍,比传统 C 无缓冲 I 快约 20%/O。
关于c - fscanf 和 fprintf 在 C 中缓冲吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758045/