BufferedInputStream的缓冲区大小

5

当使用缓冲输入流读取批量文件时,如何确定缓冲区的大小?是否基于文件大小?我正在使用以下代码:

byte[] buf = new byte[4096];

如果我增加缓冲区大小,它会更快地读取吗?


它将一次读取更多字节。 - Konstantin Yovkov
2
https://dev59.com/QnVC5IYBdhLWcg3wnCj6 - user890904
增加缓冲区大小可以减少往返时间,从而提高性能。 - Anirudha
@Anirudha 你说的往返旅行是指什么?文件I/O中没有往返旅行。你所提到的魔法是指什么?它确实可以提高性能,但不是因为那个原因。 - user207421
3个回答

11

默认值为8192字节,这是有意不想公开的。除非您有充分的理由需要更改它,否则请不要更改。


谢谢回复。如果我的文件大小低于8KB,使用8192字节是否会有问题? - user2507974
这从来不是问题。你为什么会有其他想法呢? - user207421
似乎8K非常小。我的电脑有8GB的内存。您能想到将缓冲区大小设置为500k可能存在的任何潜在缺点吗? - John Henckel
1
是的,因为分配一个500k的缓冲区比8k要花费更长的时间,并且在大多数情况下并不能真正提高性能。 - Ercksen
1
大多数计算机/操作系统的内存页面大小为4096字节,因此8192正好是两个内存页面。由于操作系统内核以页面粒度管理内存,并且大型动态内存分配可以对齐页面,因此使用页面大小的倍数作为缓冲区大小通常很方便。至于性能,很难做出任何一般性的陈述,因为从输入到输出的整个流程都会影响它。它运行的速度取决于最慢的部分,更大的缓冲区可能有助于或损害性能。 - Lassi
2
@user2507974 这不会是个问题。8K的缓冲区大小只是文件一块的最大空间,它并不需要使用所有的空间。如果你使用100万字节的缓冲区复制一个1字节的文件,你将浪费999999字节的RAM,但复制仍然可以正常工作。通常情况下,除非程序处于非常紧张的状态,否则不要担心浪费少于50KiB的空间。如果程序运行缓慢或使用过多内存,请使用能够显示原因的分析器。 - Lassi

2
你可以轻松地自行测试,但这并不是一个大问题。几千字节的缓冲区就足够了,因此你将获得良好的读取速度。
如果你分析你的应用程序并意识到文件 IO 是性能瓶颈,有一些方法可以使它更快,例如内存映射文件。

感谢您的回复,我有一个疑问,它是一次读取一块字节还是分块读取。如果它是分块读取,那么如果我们增加缓冲区的大小,读取速度将会更快,所以我在询问。 - user2507974
谢谢回复。为了避免性能问题,您提到了内存映射。请提供一些相关网站或示例。 - user2507974

0

你展示的是你读入(数组)的“字节大小”。

如果你正在从FileInputStream(即非缓冲)中读取,那么更改该大小将更改读取大小。

这与BufferedInputStream使用的内部缓冲区不同。它没有getter,但您可以在构造函数中指定大小并从那里“记住它”。默认值为8K,可能不是最优的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接