最佳文件输出缓冲区大小是多少?

1 c c++ io buffer

例如,请参阅下面的代码。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)

Non*_*upt 5

您通常不需要最佳的缓冲区大小,这可能需要查询操作系统的系统参数并进行复杂的估计,甚至对目标环境进行基准测试,而且它是动态的。幸运的是,您只需要一个足够好的值。

我想说 4K~16K 缓冲区适合大多数正常使用。其中 4K 是普通机器(x86、arm)支持的页面大小的幻数,也是常用物理磁盘扇区大小(512B 或 4K)的倍数。

如果您正在处理大量数据(千兆字节),您可能会意识到简单的 fwrite 模型不足以满足其阻塞性质。