首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中缓冲输出流比输入流更有效吗?

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

Stack Overflow用户
提问于 2012-09-06 20:00:33
回答 2查看 2.3K关注 0票数 10

今天早些时候,我感到无聊,我开始考虑Java中缓冲和未缓冲字节流的相对性能。作为一个简单的测试,我下载了a reasonably large text file并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四次测试:

  1. 使用未缓冲的输入和输出字节流复制文件。
  2. 使用缓冲输入流和未缓冲输出流复制文件。
  3. 使用未缓冲的输入流和缓冲的输出流复制文件。
  4. 使用缓冲输入和输出流复制文件。

毫不奇怪,使用缓冲的输入和输出流比使用未缓冲的流快几个数量级。然而,真正有趣的事情(至少对我来说)是案例2和3之间的速度差异。

代码语言:javascript
复制
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的时间如此不对称?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-06 20:08:04

读取文件时,它下面的文件系统和设备执行不同级别的缓存。他们几乎从来没有读过一个字节;他们读了一个块。在下一个字节的后续读取中,块将在缓存中,因此速度要快得多。

当然,如果您的缓冲区大小与块大小相同,那么缓冲输入流实际上不会给您带来那么多好处(它节省了几个系统调用,但就实际物理I/O而言,它并没有为您节省太多)。

当您编写文件时,文件系统无法为您缓存,因为您还没有给它准备编写的待办事项。它可能会为您缓冲输出,但它必须对刷新缓冲区的频率进行合理的猜测。通过自己缓冲输出,您可以让设备一次完成更多的工作,因为您手动构建了该待办事项。

票数 10
EN

Stack Overflow用户

发布于 2012-09-06 20:35:22

对于标题问题,缓冲输出更有效。其原因是硬盘驱动器(HDD)向其扇区写入数据的方式。尤其是考虑到磁盘碎片。读取速度要快得多,因为磁盘已经知道数据的位置,而必须确定数据的位置。使用缓冲区,磁盘将发现比非缓冲方式更大的连续空格来保存数据。再做一个关于咯咯笑的测试。在磁盘上创建一个新的分区,并运行测试,读取和写入干净的磁盘。若要将苹果与苹果进行比较,请在测试之间格式化新创建的分区。如果您进行测试,请在此之后张贴您的号码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12307503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档