【发布时间】:2012-09-06 20:00:33
【问题描述】:
今天早些时候感到无聊,我开始思考 Java 中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了a reasonably large text file 并编写了一个小程序来确定缓冲流在复制文件时的效果。进行了四次测试:
- 使用无缓冲的输入和输出字节流复制文件。
- 使用缓冲输入流和非缓冲输出流复制文件。
- 使用无缓冲输入流和缓冲输出流复制文件。
- 使用缓冲的输入和输出流复制文件。
不出所料,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我而言)是案例 2 和案例 3 之间的速度差异。一些示例结果如下:
Unbuffered input, unbuffered output
Time: 36.602513585
Buffered input, unbuffered output
Time: 26.449306847
Unbuffered input, buffered output
Time: 6.673194184
Buffered input, buffered output
Time: 0.069888689
对于那些感兴趣的人,代码是可用的here at Github。谁能解释为什么案例 2 和 3 的时间如此不对称?
【问题讨论】:
-
我会说无缓冲读取比无缓冲写入快....
-
@beny23 我想他明白了,他在问为什么。
-
在读取数据时,您应该首先通过多次调用相同的函数来触发 JIT。在你的情况下说 10 次。然后在每个方法之后你应该调用 GC,这样它就不会干预任何特定的结果。因为在您当前的代码中,如果您更改顺序,结果会有所不同
-
当您在每个后续测试中重新读取文件时,您几乎可以肯定是从缓存而不是磁盘文件中读取它,因此您的测试实际上是无效的。您必须找到一种方法来在每次测试运行之间取消缓存。
-
@EJP 谢谢。我已经尝试过了,你是对的:确保在后续测试之前刷新缓存会显着降低性能。不过大体模式还是一样的。