批量写入文件与块写入文件

Writing to files in Bulk vs Chunks

设置

使用标准 C 代码(= 没有特定于平台的代码),我编写了一个程序来执行以下操作:

  1. 开始 clock()
  2. 打开文件
  3. 使用下面列出的模式之一向其中写入一个 ~250MB 长的字符串
  4. 关闭文件。
  5. 尽可能快地重复 2...4 10000 次,rip 存储单元
  6. 结束clock()
  7. 做一些时间计算并输出

然后,我让程序运行在两台不同的电脑上。

预期

我希望 A)B) 快。

结果

下面是我配备三星 970 EVO M.2 SSD 的强大 PC(CPU = AMD Ryzen 2700x:8 核/16 线程)。 这个输出有点错误,应该是Ns/file,而不是Ns/write)

下面是我的笔记本电脑。我真的不知道安装的是什么类型的 SSD(我也懒得去检查)。如果这很重要,或者有人想 并且 知道如何研究,笔记本电脑是 Surface Book 3。

结论

我最好的猜测是某种隐藏的并行化在起作用。 CPU 可以做聪明的事情,SSD 可以做非常聪明的事情,或者它们一起工作可以做非常聪明的事情。但是固定和写下任何进一步的东西对我来说太荒谬了,不能把它留在这里。

如何解释我的期望和结果之间的差异?

基准

查看 https://github.com/rphii/Rlib,在 examples/writecomp.c

更多文字

我在使用长度约为 25MB 的强大 PC 上工作时注意到了这种效果。由于 B)A) 快约 4 毫秒,所以我增加了字符串长度并进行了更彻底的测试。

既然没人会做,我就根据收到的评论回答我的问题。

  1. clock 测量的不是挂钟时间,而是 CPU 时间。请阅读 this post.
  2. Reads/writes一般都是有缓冲的
  3. 操作系统通常使用 in-memory 缓存(尤其是 HDD)。
  4. SSD 并行读取速度更快(最近的读取速度通常更快),而 HDD 并行读取速度几乎从不快。 (this quite recent post 提供了一些关于缓存和缓冲的信息)。