当前位置: 首页 > 知识库问答 >
问题:

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

厍兴腾
2023-03-14

今天早些时候很无聊,我开始思考Java中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了一个相当大的文本文件,并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四项测试

  1. 使用无缓冲的输入和输出字节流复制文件

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

共有3个答案

龚承嗣
2023-03-14

一般来说,写作对电脑来说更乏味,因为它不能缓存,而阅读可以。一般来说,这很像现实生活中——阅读比写作更快、更容易!

米元凯
2023-03-14

对于标题问题,缓冲输出更有效。原因是硬盘驱动器(HDD)将数据写入其扇区的方式。特别是考虑到碎片化磁盘。读取速度要快得多,因为磁盘已经知道数据在哪里,而不必确定数据将放在哪里。使用缓冲区,磁盘将找到比未缓冲方式更大的连续空白空间来保存数据。运行另一个测试以查看是否有人咯咯笑。在您的磁盘上创建一个新分区,并运行测试,以完全恢复读写操作。要将苹果与苹果进行比较,请格式化测试之间新创建的分区。如果您运行测试,请在此之后发布您的数字。

郎星汉
2023-03-14

读取文件时,文件系统及其下的设备会执行不同级别的缓存。他们几乎从不一次读取一个字节;他们读了一个方块。在后续读取下一个字节时,该块将位于缓存中,因此速度会快得多。

因此,如果缓冲区大小与块大小相同,那么缓冲输入流实际上并不能为您带来太多好处(它可以节省一些系统调用,但就实际的物理I/O而言,它不会为您节省太多)。

当您编写文件时,文件系统无法为您缓存,因为您没有给它一个要写的积压工作。它可能会为您缓冲输出,但它必须有根据地猜测刷新缓冲区的频率。通过自己缓冲输出,您可以让设备一次完成更多的工作,因为您需要手动构建积压工作。

 类似资料:
  • 正在为以下内容编写javadoc: 但是,将缓冲的输入流传入真的是一个问题吗?因此: 是否将is缓冲到bis中,或者java是否检测到is已缓冲并设置bis=is?如果是,不同的缓冲区大小是否会有所不同?如果没有,为什么不呢<注意:我说的是输入流,但实际上这个问题也适用于输出流

  • 问题内容: 什么是输出缓冲?为什么在PHP中使用它? 问题答案: Web开发人员的输出缓冲,初学者指南 如果没有输出缓冲(默认),则HTML将通过脚本逐步地作为PHP进程发送到浏览器。使用输出缓冲,您的HTML存储在一个变量中,并在脚本末尾作为一个片段发送到浏览器。 Web开发人员的输出缓冲优势 单独打开输出缓冲可减少下载和呈现HTML所需的时间,因为在PHP处理HTML时,不会将其分段发送给浏览

  • 问题内容: 默认情况下,Python的解释器是否启用输出缓冲? 如果答案是肯定的,那么有什么方法可以禁用它? 到目前为止的建议: 使用命令行开关 包装每次写入后刷新的对象 设置环境变量 还有其他方法可以在执行过程中以编程方式在中设置一些全局标志吗? 问题答案: 你可以使用”python -u”()或通过设置环境变量PYTHONUNBUFFERED来跳过整个python进程的缓冲。 你还可以将替换为

  • 问题内容: 我的测试应用程序是 我想在每个输入字符后看到字符代码。但实际上* s仅在控制台中的’\ n’之后打印。因此,似乎缓冲了stdin(文件的desc 0)。但是读取功能没有缓冲区,不是吗?我哪里错了。 UPD:我使用linux。 所以解决方案是 问题答案: 不幸的是,标准ANSI C无法实现您要查找的行为,并且UNIX终端I / O的默认模式是面向行的,这意味着您将始终需要输入的字符来检索

  • 根据我的阅读,我认为使用MySQL JDBC驱动程序在MySQL中流式传输< code>ResultSet的方法是这两个命令: 我的问题是,专家能否澄清使用上述代码流式传输ResultSet是否会将一行返回给客户端,然后去服务器获取下一行,依此类推(效率非常低),或者它是否足够智能,可以像一样进行缓冲流式传输?如果它进行缓冲流式传输,如何设置缓冲区大小? 编辑:来自文档: 前向只读结果集与整数获取

  • 问题内容: 我编写了一个简单的中继脚本,该脚本连接到网络摄像机并从套接字读取数据,并使用打印功能输出此数据。数据是已设置边界的MJPG数据。我只是输出读取的数据。 问题是PHP似乎正在缓冲这些数据。当我将相机设置为1 FPS时,Feed将冻结7-8秒,然后快速显示8帧。如果将分辨率设置为很大,则相机每秒将以大约1帧的速度移动。我认为那时正在发生一些缓冲(因为大尺寸的缓冲区会很快填充,而小尺寸的缓冲