缓冲输出流比Java中的输入流更有效吗?

前端之家收集整理的这篇文章主要介绍了缓冲输出流比Java中的输入流更有效吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天早些时候很无聊,我开始思考一下 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案例的时间是如此不对称?

解决方法

当您读取文件时,其下的文件系统和设备会进行各种级别的缓存.他们几乎从来没有读过一个字节;他们读了一个街区.在随后读取下一个字节时,该块将处于高速缓存中,因此将更快.

因此,如果您的缓冲区大小与块大小相同,则缓冲输入流实际上并不会获得所有的收益(它节省了一些系统调用,但是在实际的物理I / O方面)不会挽救你太多).

当你写一个文件时,文件系统不能为你缓存,因为你没有给它积压的东西写.它可能可能缓冲您的输出,但它必须有一个有经验的猜测冲洗缓冲区的频率.通过自己缓冲输出,您可以让设备立即执行更多工作,因为您手动构建积压.

猜你在找的Java相关文章