BufferedInputStream 顶部的 BufferedReader 与 FileInputStream 顶部的 BufferedReader

BufferedReader on top of BufferedInputStream VS BufferedReader on top of FileInputStream

提问人:joker 提问时间:7/30/2023 更新时间:7/30/2023 访问量:53

问:

如果我们有以下情况,是否有任何性能提升:

BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream("SOME_FILE")), StandardCharsets.UTF_8))

请注意,我添加了 ,这是不寻常的,在我的经验中。BufferedInputStream

通常,它与添加的中间缓冲输入流一起使用:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(""), StandardCharsets.UTF_8))

如果存在性能差异,如何衡量?

我尝试的是使用两种方法读取 ~30 MB 文本文件,每种方法 3 次。

令我惊讶的是,在没有缓冲的情况下,输入流比缓冲的对应器快约 10%。

我不知道是否在某些情况下,缓冲版本比其他版本更胜一筹,或者它只是一个冗余缓冲,导致的开销大于它的用处。

Java 性能 文件 bufferedreader bufferedinputstream

评论

4赞 Elliott Frisch 7/30/2023
您已经有一个带有 .添加第二个缓冲区不太可能有太大变化,缓冲缓冲区 10% 的惩罚听起来很合理。BufferedReader
1赞 Sascha 7/31/2023
您不需要双重缓冲区。但是,您可以通过选择缓冲区容量来提高性能。默认值为 。根据您的系统和您读取的文件,值越高可能越好。8192
0赞 joker 8/1/2023
谢谢@Sascha。我尝试操作缓冲区,但没有明显的性能提升。事实上,有时性能更差。我厌倦了使输入流缓冲区比缓冲读取器高得多,然后尝试了相反的方法。因此,看起来,通常在普通文件输入流之上的缓冲读取器,而无需在字节级别进行缓冲就足够了。
0赞 g00se 8/1/2023
可能值得检查一下 nio 是否给你带来了任何改进:try (BufferedReader in = Files.newBufferedReader(Path.of("x.txt"), StandardCharsets.UTF_8)) {...}

答: 暂无答案