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

标签 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;
}

最佳答案

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

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

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

关于c++ - 最佳文件输出缓冲区大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172761/

相关文章:

c++ - 使用带有 fstream 的映射的段错误

c - 为什么数组的地址等于它在 C 中的值?

java - PostgreSQL 异常 : "An I/O error occured while sending to the backend"

c 使用结构指针数组写入和读取文件

c++ - 在 xcode 10 上找不到 stdlibc++ header 错误

c++ - 如何在文本文件中读取数据并为每列分配数组C++

C++ delete - 它删除了我的对象,但我仍然可以访问数据?

c - 使用 mingw 在 Linux 上将 c 编译为 (windows)exe 时出错

c - 我有一个在递归函数中声明的数组。我该如何排序?

linux - 写入文件非常快,覆盖文件需要更长的时间