今天早些时候感到无聊,我开始思考 Java 中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了一个相当大的文本文件并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四项测试:
- 使用无缓冲的输入和输出字节流复制文件。
- 使用缓冲输入流和非缓冲输出流复制文件。
- 使用无缓冲输入流和缓冲输出流复制文件。
- 使用缓冲的输入和输出流复制文件。
毫不奇怪,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我而言)是案例 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
对于那些感兴趣的人,代码可以在 Github上找到。谁能解释为什么案例 2 和 3 的时间如此不对称?