gpt4 book ai didi

java - 在 Java 中缓冲输出流是否比输入流更有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:20 27 4
gpt4 key购买 nike

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

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

不出所料,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我而言)是案例 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 的时间如此不对称?

最佳答案

当您读取一个文件时,其下的文件系统和设备会进行不同级别的缓存。他们几乎从不一次读取一个字节;他们读了一个街区。在随后读取下一个字节时,该 block 将位于缓存中,因此速度会快得多。

按理说,如果你的缓冲区大小与你的 block 大小相同,那么缓冲输入流实际上并没有给你带来太多好处(它节省了一些系统调用,但就实际物理而言我/O 它不会为你节省太多)。

当你一个文件时,文件系统不能为你缓存,因为你没有给它积压的东西来写。它可能会为您缓冲输出,但它必须对刷新缓冲区的频率进行有根据的猜测。通过自己缓冲输出,您可以让设备一次完成更多工作,因为您手动建立了积压工作。

关于java - 在 Java 中缓冲输出流是否比输入流更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com