为什么缓冲I / O比无缓冲I / O更快

时间:2015-04-27 09:18:28

标签: c file io buffer

在阅读this时,我找到了一个合理的答案,其中说:

  

案例1:直接写入磁盘上的文件

100 times x 1 ms = 100 ms

我明白了。接下来,

  

案例3:在写入磁盘上的文件之前在内存中缓冲

(100 times x 0.5 ms) + 1 ms = 51 ms

我不明白1毫秒。将100个数据写入磁盘和将1个数据写入磁盘之间有什么区别?为什么两个都花费1毫秒?

4 个答案:

答案 0 :(得分:7)

光盘访问(将数据传输到磁盘)不会发生逐字节,它发生在中。因此,如果编写1字节数据的时间为1 ms,则无法结束,那么x个字节的数据将花费{{1} } 女士。它不是线性关系。

一次写入磁盘的数据量取决于块大小。例如,如果光盘访问花费您1ms,并且块大小为512字节,则写入1到512字节之间的大小将花费相同的时间,仅1 ms。

所以,回到eqation,如果你有,比如要在每个opeartion写入16个字节的数据进行20次迭代,那么,

  • 直接撰写案例

time =(x次迭代* 20 ms)== 1 ms。

  • 用于缓冲访问

time =(20次迭代* 20 ms (缓冲时间))+ 0.5 ms(一次写入所有内容)= {{1} } + 1 == 10 ms。

答案 1 :(得分:1)

这是因为光盘的物理运作方式。 他们可以使用更大的缓冲区(称为页面)并一次性保存它们。 如果你想一直保存数据,你需要多次更改一个页面,如果你使用缓冲区,你可以编辑快速访问的内存,然后一次性保存所有内容。

他的例子是解释经营成本。 为了将内存加载到数据,您有100次操作0.5秒的成本,然后您有一个更改光盘(IO操作),答案中没有描述,并且可能不明显,几乎所有光盘都提供批量传输更改操作。因此,1 IO操作意味着1保存到光盘,不一定是1位保存(可以是更多数据)。

答案 2 :(得分:0)

除其他外,数据被写入整个"块"只要。块通常是512字节。即使您只更改块内的单个字节,操作系统和磁盘也必须写入所有512个字节。如果在写入之前更改了块中的所有512个字节,则实际写入将不会比仅更改一个字节时慢。

操作系统和/或磁盘内的自动缓存确实在很大程度上避免了这个问题。然而,每一个真实的"写操作需要从程序到操作系统的调用,并且可能一直到磁盘驱动程序。这需要一些时间。相比之下,在您自己的进程中写入char / byte / ...数组' RAM中的内存几乎不需要任何费用。

答案 3 :(得分:0)

一次写入1个字节时,每次写入都需要:

  1. 磁盘搜索时间(可以变化)将'head'放在 正确跟踪磁盘,
  2. 磁盘旋转等待时间,同时等待磁盘的正确扇区位于“head”之下。
  3. 读取扇区时的磁盘读取时间(旋转延迟 如果是,则扇区读取时间可能不止一次 CRC与磁盘上保存的CRC不匹配
  4. 将新字节插入扇区中的正确位置
  5. 旋转延迟等待适当的扇区再次位于'头部'
  6. 之下
  7. 扇区写入时间(包括新CRC)。
  8. 对每个字节重复所有上述操作(特别是因为磁盘比内存慢几个数量级)需要很多时间。

    编写整个数据扇区不再需要更新单个字节 这就是为什么写一个充满数据的缓冲区比写一系列单个字节要快得多。

    还有其他开销,例如更新inode:

    • 跟踪目录
    • 跟踪单个文件

    每次更新文件时,都会更新每个目录和文件inode。

    那些inode(简称)是磁盘上的其他扇区。总的来说,每次修改文件时都会发生大量磁盘活动。

    因此,只修改一次而不是多次修改文件是一个重要的时间节省。缓冲是用于最小化磁盘活动数量的技术。