批量写入文件与块写入文件
Writing to files in Bulk vs Chunks
设置
使用标准 C 代码(= 没有特定于平台的代码),我编写了一个程序来执行以下操作:
- 开始
clock()
- 打开文件
- 使用下面列出的模式之一向其中写入一个 ~250MB 长的字符串
- 关闭文件。
- 尽可能快地重复 2...4 10000 次,rip 存储单元
- 结束
clock()
- 做一些时间计算并输出
A)
批量模式:一次写入所有内容(=一次调用 fwrite
)
B)
块模式:以块的形式写入字符串。一个块略大于 1MB。 (= 多次调用 fwrite
,大约 250 次)。
然后,我让程序运行在两台不同的电脑上。
预期
我希望 A)
比 B)
快。
结果
下面是我配备三星 970 EVO M.2 SSD 的强大 PC(CPU = AMD Ryzen 2700x:8 核/16 线程)。 这个输出有点错误,应该是Ns/file,而不是Ns/write)
下面是我的笔记本电脑。我真的不知道安装的是什么类型的 SSD(我也懒得去检查)。如果这很重要,或者有人想 并且 知道如何研究,笔记本电脑是 Surface Book 3。
结论
- Beefy PC:
B)
比 A)
快,超出预期。
- 笔记本电脑:
A)
比 B)
快,符合预期。
我最好的猜测是某种隐藏的并行化在起作用。 CPU 可以做聪明的事情,SSD 可以做非常聪明的事情,或者它们一起工作可以做非常聪明的事情。但是固定和写下任何进一步的东西对我来说太荒谬了,不能把它留在这里。
如何解释我的期望和结果之间的差异?
基准
查看 https://github.com/rphii/Rlib,在 examples/writecomp.c
下
更多文字
我在使用长度约为 25MB 的强大 PC 上工作时注意到了这种效果。由于 B)
比 A)
快约 4 毫秒,所以我增加了字符串长度并进行了更彻底的测试。
既然没人会做,我就根据收到的评论回答我的问题。
- clock 测量的不是挂钟时间,而是 CPU 时间。请阅读 this post.
- Reads/writes一般都是有缓冲的
- 操作系统通常使用 in-memory 缓存(尤其是 HDD)。
- SSD 并行读取速度更快(最近的读取速度通常更快),而 HDD 并行读取速度几乎从不快。 (this quite recent post 提供了一些关于缓存和缓冲的信息)。
设置
使用标准 C 代码(= 没有特定于平台的代码),我编写了一个程序来执行以下操作:
- 开始
clock()
- 打开文件
- 使用下面列出的模式之一向其中写入一个 ~250MB 长的字符串
- 关闭文件。
- 尽可能快地重复 2...4 10000 次,rip 存储单元
- 结束
clock()
- 做一些时间计算并输出
A)
批量模式:一次写入所有内容(=一次调用fwrite
)B)
块模式:以块的形式写入字符串。一个块略大于 1MB。 (= 多次调用fwrite
,大约 250 次)。
然后,我让程序运行在两台不同的电脑上。
预期
我希望 A)
比 B)
快。
结果
下面是我配备三星 970 EVO M.2 SSD 的强大 PC(CPU = AMD Ryzen 2700x:8 核/16 线程)。 这个输出有点错误,应该是Ns/file,而不是Ns/write)
下面是我的笔记本电脑。我真的不知道安装的是什么类型的 SSD(我也懒得去检查)。如果这很重要,或者有人想 并且 知道如何研究,笔记本电脑是 Surface Book 3。
结论
- Beefy PC:
B)
比A)
快,超出预期。 - 笔记本电脑:
A)
比B)
快,符合预期。
我最好的猜测是某种隐藏的并行化在起作用。 CPU 可以做聪明的事情,SSD 可以做非常聪明的事情,或者它们一起工作可以做非常聪明的事情。但是固定和写下任何进一步的东西对我来说太荒谬了,不能把它留在这里。
如何解释我的期望和结果之间的差异?
基准
查看 https://github.com/rphii/Rlib,在 examples/writecomp.c
下更多文字
我在使用长度约为 25MB 的强大 PC 上工作时注意到了这种效果。由于 B)
比 A)
快约 4 毫秒,所以我增加了字符串长度并进行了更彻底的测试。
既然没人会做,我就根据收到的评论回答我的问题。
- clock 测量的不是挂钟时间,而是 CPU 时间。请阅读 this post.
- Reads/writes一般都是有缓冲的
- 操作系统通常使用 in-memory 缓存(尤其是 HDD)。
- SSD 并行读取速度更快(最近的读取速度通常更快),而 HDD 并行读取速度几乎从不快。 (this quite recent post 提供了一些关于缓存和缓冲的信息)。