你如何决定用于 InputStream.read() 的 byte[] 大小?

2022-09-01 05:25:56

从 InputStreams 读取时,如何确定字节 [] 的大小?

int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about

while ((nRead = is.read(data, 0, data.length)) != -1) {
  ...do something..
}

你什么时候使用小的和大的?有什么区别?该数字是否希望以 1024 为增量?如果它是来自网络和磁盘的输入流,是否有区别?

非常感谢,我似乎无法在其他地方找到明确的答案。


答案 1

大多数人使用2的幂作为大小。如果缓冲区至少为512字节,则不会有太大区别(<20%)。

对于网络,最佳大小可以是 2 KB 到 8 KB(基础数据包大小通常最大为 ~1.5 KB)对于磁盘访问,最快大小可以是 8K 到 64 KB。如果您使用8K或16K,则不会有问题。

请注意,对于网络下载,您可能会发现通常不使用整个缓冲区。对于99%的用例来说,浪费几KB并不重要。


答案 2

在这种情况下,我总是使用合理的2次幂,在2K到16K的范围内。通常,不同的输入流将具有不同的最佳值,但没有简单的方法来确定该值。

为了确定最佳值,您需要详细了解您正在处理的 InputStream 的确切类型,以及为 InputStream 提供服务的硬件的规格等信息。

担心这一点可能是过早优化的情况。


推荐