例如,请参见下面的代码。 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;
}
最佳答案
您通常不需要最佳 缓冲区大小,这可能需要向操作系统查询系统参数并进行复杂的估计,甚至对目标环境进行基准测试,而且它是动态的。幸运的是,您只需要一个足够好的值。
我会说 4K~16K 缓冲区适合大多数正常使用。其中 4K 是普通机器(x86、arm)支持的页面大小的魔数(Magic Number),也是通常物理磁盘扇区大小(512B 或 4K)的倍数。
如果您正在处理大量数据(千兆字节),您可能会意识到简单的 fwrite-model 不足以满足其阻塞特性。
关于c++ - 最佳文件输出缓冲区大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172761/