c - 如何确定缓冲区的大小

标签 c file malloc buffer

我有一个程序,它的目的是从一些输入文本文件中读取,将所有可打印的字符(即 32 到 126 之间的 ASCII)过滤到其他一些输出文本文件中。

我还得到一个参数“DataAmount”——这意味着我需要读取的数据量是多少——可能是1B、1K、1M、1G、80000B等(单位前可以是任何自然数)。

这不是输入文件的大小,而是我需要从输入文件中读取多少。如果输入文件小于数据量,我需要重新读取文件,直到我准确读取 DataAmount 字节。

对于过滤,我从输入文件读取到某个缓冲区。我从缓冲区过滤到其他缓冲区的可打印字符,然后从该缓冲区写入输出文件(两个缓冲区的大小相同)。

问题是,我如何确定这两个缓冲区的最佳大小,以便对 read() 和 write() 的调用最少?

(注意:我不会一次写入整个数据,因为它可能太大,而且我不会一次写入每个字节。只有当缓冲区是满)。

目前,我构建的缓冲区大小仅取决于单位:

如果是B或K,则大小为1024。

如果是 M 或 G,则大小为 4096。

这一点都不好,因为对于 1B 和 100000B,我将拥有相同大小的缓冲区。

我该如何改进?

最佳答案

我的个人经验是,只要您使用的是几千字节,缓冲区大小并不重要。

正如您在问题中指出的那样,执行系统调用会产生开销,因此一次执行一个字符的 I/O 效率不是很高,您可以通过读取和写入更大的 block 来减少开销。但是,还有其他事情需要时间,任何合理数量的缓冲都会将您的系统调用开销降低到其他事情占用大部分时间的程度。在这一点上,更大的缓冲区不会使程序明显更快。将缓冲区设置得过大也会带来问题,因此您也可能会在这个方向上犯错。

我不会像您所做的那样使缓冲区大小动态变化。它给程序带来了不必要的复杂性。您可以通过使用不同的缓冲区大小运行您的程序来验证这一点,并查看它会产生什么样的差异。

至于实际使用的值,stdio.h 头文件定义了宏 BUFSIZ,这是 stdio 缓冲区的默认大小。该宏的大小适合使用。

另请注意,如果您使用 stdio 函数来执行 I/O,它们已经提供了缓冲(如果您不直接调用系统调用 read() 和 write(),那么您正在使用 stdio。)没有理由两次缓冲数据,因此您可以一次执行一个字符的 I/O,让 stdio 缓冲区为您处理它,或者使用 setvbuf() 禁用 stdio 缓冲。

关于c - 如何确定缓冲区的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43194440/

相关文章:

html - 静态文件和模板可能存在的 Django 错误

c++ - 将相同数据写入两个文件的有效方法

c - 没有 malloc 或 calloc 的 free() 函数

C 变量在初始化其他变量后变化

c++ - 使用 Clang 将 C++ 代码转换为 C 代码

比较目录C中所有文件的内容

C - 从数组中的文件加载数据

c - 在 struct - C 中初始化数组?

c - 格式字符串前下划线 `_`

c - 如果删除链表的最后一个节点,程序将崩溃