【问题标题】:How does buffered I/O reduce the overhead which would occur if unbuffered I/O was used?如果使用非缓冲 I/O,缓冲 I/O 如何减少开销?
【发布时间】:2016-06-04 06:32:03
【问题描述】:

来自this tutorial

到目前为止,我们看到的大多数示例都使用无缓冲 I/O。这意味着 每个读取或写入请求都由底层操作系统直接处理。 这会使程序的效率大大降低,因为每个这样的请求 经常触发磁盘访问、网络活动或其他一些操作 这是相对昂贵的

为了减少这种开销,Java 平台实现了缓冲 I/O 流。缓冲的输入流从已知的内存区域读取数据 作为缓冲区本地输入 API 仅在缓冲区被调用时调用 空。类似地,缓冲输出流将数据写入缓冲区,并且 仅在缓冲区已满时调用本机输出 API。

我了解磁盘访问、网络活动等操作会导致底层操作系统的内存或执行时间开销。

但问题是程序读取/写入到某个内存区域(缓冲区)如何减少这种开销?

我认为这是增加了几个额外步骤:首先,程序请求操作系统,例如,从文件中读取数据并将其写入缓冲区,然后程序从缓冲区中读取数据。

【问题讨论】:

  • 嗯,我的 RAM 比我的 HDD 快得多,并且与 HDD 或 SSD 相比,与 CPU 的连接更好。
  • 除了@Code-Apprentice 的回答,您还可以查看stackoverflow.com/questions/9648811/…

标签: java inputstream outputstream bufferedwriter bufferedinputstream


【解决方案1】:

您可能知道,磁盘驱动器、网络连接或其他设备的 IO 操作比内存访问慢得多。通过在内存中缓冲 IO 操作,软件可以减少在 IO 设备上执行的操作数量。

【讨论】:

  • 谢谢。但这是否也意味着我的问题的最后一段是正确的,即使用缓冲流仍然涉及请求操作系统从磁盘驱动器获取数据并将其存储在我们的缓冲区中;我们的程序将从哪里读取它。我的意思是我是否应该摆脱这一点,缓冲区很有用,因为一旦将数据放入缓冲区(由底层操作系统),我们的程序就可以一次又一次地多次读取它,而无需每次都请求操作系统.
  • @Solace 是的,通过缓冲我们可以减少对操作系统执行 IO 操作的请求数量。这不仅对于一次又一次地读取相同的数据很有用,而且对于从文件或网络读取连续的数据也很有用。
猜你喜欢
  • 2012-01-14
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多