【发布时间】:2015-08-23 23:57:11
【问题描述】:
请参见下面的代码示例。 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;
}
【问题讨论】:
-
最佳输出缓冲区大小为:42。
-
这太宽泛了...
-
大小为 1 时,所涉及的系统调用的开销相对较高。随着更大的大小,系统调用开销的百分比会下降,并且“真实”写入文件系统缓存会占用运行时。我会写尽可能大的包。
-
没有“最佳”。这取决于磁盘、操作系统、您可以腾出多少内存……随着您的增加,收益会递减。在某个时候,下一次增加的边际价值足够小,以至于您不想为此付出代价。测试和测量。
-
在类 UNIX 操作系统上,您可以通过调用
stat()并查看st_blksize()成员来找到给定文件的最佳缓冲区大小。如果这太乏味你也可以使用<stdio.h>提供的BUFSIZ宏作为一个很好的默认缓冲区大小。