当使用Java传输(不管向上/向下)大文件(3-4 of )时,合理的缓冲区大小是多少?
byte buf[] = new byte[1024]或
byte buf[] = new byte[5 * 1024 * 1024]有时,即使您使用一个大的缓冲区并传递给一个读取(字节array[])方法,这也不能保证您将获得一个完整的5me缓冲区。在我的测试中,我观察到每次read()调用的平均大小通常是1.5kb。这在性能方面有意义吗?如果有人能给我推荐一个讨论这个问题的更详细的资源,我会很高兴的。
发布于 2011-09-05 21:47:47
听起来像是在从网络连接(TCP?)读取数据。
1500字节是默认的以太网MTU,这解释了为什么每次读取通常会获得1.5KB。通过将网络堆栈配置为使用jumbo frames,MTU通常可以增加到9KB。
考虑到这一点,几乎可以肯定,使buf大于9KB是没有意义的。使用较小的缓冲区(比方说超过1KB)可能会也可能不会对性能产生负面影响。
在任何情况下,获得明确答案的唯一方法是对各种缓冲区大小进行基准测试。
发布于 2013-02-26 06:54:49
在我的研究和测试中,在使用Java6的Linux上从套接字读取数据时,8K是最优的缓冲区大小。如果分配的缓冲区大于8K,那将是对空间的浪费。我读到过Java的本机调用使用8K缓冲区,这就是为什么8K是最佳的,但我已经失去了我的参考资料。有一个bug指出了这一事实,但这不是确凿的证据:http://bugs.sun.com/view_bug.do?bug_id=6444633
也就是说,尝试在您有兴趣部署的平台上进行实验,您将找到最佳的缓冲区大小。如果你很懒,8K是一个很好的默认值。
https://stackoverflow.com/questions/7308957
复制相似问题