C write() 时间不一致

Posted

技术标签:

【中文标题】C write() 时间不一致【英文标题】:C write() time inconsistency 【发布时间】:2020-11-27 16:06:03 【问题描述】:

我编写了一个小程序,用于测量 Linux 中 c write() 函数的时间。令我惊讶的是,时间在多次迭代中并不一致。我已经看到第一次写入比立即连续写入花费的时间要长得多。该模式在多次运行/文件大小-缓冲区大小组合中继续存在。

代码如下: https://drive.google.com/file/d/1akwUz9mykkp0kk-FID9jxPClwJMD7uRI/view?usp=sharing

这是部分输出:

它:0 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.051 S:MS

它:1 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.027 S:MS

它:2 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.022 S:MS

它:3 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.021 S:MS

它:4 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.021 S:MS

它:5 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.021 S:MS

它:6 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.022 S:MS

它:7 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.022 S:MS

它:8 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.021 S:MS

它:9 文件大小:4.00MB 缓冲区大小:1.00KB 写入时间:0.021 S:MS

请注意它是如何编写函数调用的:0 几乎是连续调用的两倍。这种模式不断重复。它可能与 linux 页面缓存有关,但我不知道它到底是如何发挥作用的。救命!

【问题讨论】:

听说过磁盘缓存?听说过时间切片吗? 也许在第一个中,东西被初始化了? 请edit您的问题包括minimal reproducible example。性能可能取决于许多因素,包括您自己程序中的数据,当然还有许多外部因素。 我已添加该程序的链接。谢谢。 【参考方案1】:

这与处理器的缓存架构有关。在程序的第一次迭代期间,存储在硬盘驱动器或 SSD 内存中的文件被移动到缓存中以便进行处理,随着文件大小的增加,这需要更多时间。当程序再次需要相同的文件时,它将简单地使用存储在缓存中的文件,跳过主存。这会在第一次迭代和其余迭代之间产生写入时间差。

【讨论】:

缓存命中也可能在操作系统级别命中,并且取决于驱动器硬件,在磁盘驱动器的电子设备中也是如此。

以上是关于C write() 时间不一致的主要内容,如果未能解决你的问题,请参考以下文章

函数write()与数字表示法不一致

ggplot图与观察结果不一致

C ++ - Boost streambuf放气的行为不一致?

openmp/C++ 简单并行区域返回不一致的结果

C# DateTime 解析不一致

MSVC2015 上的实验性 C++17 文件系统:权限不一致