【发布时间】:2012-05-28 17:25:37
【问题描述】:
可能重复:
How do you determine the ideal buffer size when using FileInputStream?
当使用 C++ 的 istream 系列的 read() 或 C 的 fread() 从文件(或任何输入流)读取原始数据时,必须提供缓冲区,以及要读取的数据量。我见过的大多数程序似乎都是在 512 和 4096 之间任意选择 2 的幂。
- 是否有理由必须/应该是 2 的幂,或者这只是程序员对 2 的幂的自然倾向?
- 什么是“理想”数字? “理想”是指它是最快的。我认为它必须是底层设备缓冲区大小的倍数?或者可能是底层流对象的缓冲区?无论如何,我将如何确定这些缓冲区的大小?一旦我这样做了,使用它的倍数是否会比仅使用精确大小来提高速度?
编辑
大多数答案似乎是在编译时无法确定。我可以在运行时找到它。
【问题讨论】:
-
我相信缓冲区大小取决于编译器或机器(抱歉,我不知道是哪一个,或者两者兼而有之)。唯一知道的方法是尝试读取各种大小的数据。它应该很快,所以做 100 次并取平均值。它不应该是一条直线。我的猜测是,当您越过必须读取另一个数据缓冲区的点时,您应该注意到。 (或者,您可以挖掘 C/C++ 的源代码...)
-
如有疑问,请始终将缓冲区大小设为 2 的幂。其他程序员会认为你这样做是出于某种聪明的原因。 ;-)
-
重新编辑:运行时间没有多大帮助。您需要在开发时进行分析,除非您每次启动自适应缓冲代码时都可以承受大量数据的极端“热身运行”。