例如,请参阅下面的代码。size是1MB,当然比它是1时运行得更快。我认为这是由于IO系统调用的数量减少了。这是否意味着我将始终受益于更大的缓冲区大小?我希望如此并进行了一些测试,但似乎有一些限制。size为 2 时会比为 1 时运行得快得多,但不会走得更远。
有人可以更好地解释这一点吗?最佳缓冲区大小可能是多少?为什么我不能从无限扩大它的规模中获益呢?
顺便说一句,在这个例子中,我为简单起见而写入stdout,但我也在考虑何时写入磁盘中的文件。
enum
{
size = 1 << 20
};
void fill_buffer(char (*)[size]);
int main(void)
{
long n = 100000000;
for (;;)
{
char buf[size];
fill_buffer(&buf);
if (n <= size)
{
if (fwrite(buf, 1, n, stdout) != n)
{
goto error;
}
break;
}
if (fwrite(buf, 1, size, stdout) != size)
{
goto error;
}
n -= size;
}
return EXIT_SUCCESS;
error:
fprintf(stderr, "fwrite failed\n");
return EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)
您通常不需要最佳的缓冲区大小,这可能需要查询操作系统的系统参数并进行复杂的估计,甚至对目标环境进行基准测试,而且它是动态的。幸运的是,您只需要一个足够好的值。
我想说 4K~16K 缓冲区适合大多数正常使用。其中 4K 是普通机器(x86、arm)支持的页面大小的幻数,也是常用物理磁盘扇区大小(512B 或 4K)的倍数。
如果您正在处理大量数据(千兆字节),您可能会意识到简单的 fwrite 模型不足以满足其阻塞性质。