C++程序在重新执行时加速

C++ program speeds up when re-executed

我目前正在对 C++ 程序进行性能测试。我需要批量插入 std::unordered_map 或其他类似的开源结构。我插入 30-40 个字符字符串作为键值对,并注意到一个有趣的行为。第一次执行代码时(Clion),用了20秒才完成,我重复测试(什么都没改),是14s,然后又是8s,4s,现在的代码运行s 大约 3s。我应该重复一遍,我的代码中唯一昂贵的操作是批量 unordered_map insert,多线程 std::lock_guard<std::mutex>.

另一个重要的信息是我正在从文件中读取这些键和值。所以我想到了 Ubuntu 中发生的一些文件缓存。但我用不同的机制做同样的事情,从未经历过这样的事情。然后我想到了一些 RAM 分配技巧,这些技巧可能会在程序结束后保持大部分地图完好无损。但我没有做任何事情来实现这一目标。

为什么会这样?不仅如此,我该如何重置它?我需要做 objective 测试,因为我的代码将 运行 在多个服务器中,而没有任何预缓存。

谢谢。

第一次 运行 代码必须:

  • 如果磁盘停转或空闲则唤醒磁盘
  • 从磁盘读取数据
  • 从磁盘读取可执行文件
  • 也可能加载一些共享库

第二次你运行代码可以:

  • 从内存中的OS读取缓存中读取数据
  • 从内存中的 OS 读取缓存读取可执行文件
  • 从内存中的 OS 读取缓存中读取共享库
  • 将 CPU 调高到更高的频率,因为它处于负载状态

这就是为什么 运行 测试 多次 并且 延长时间段 很重要,而不仅仅是几秒钟但至少连续 10-15 分钟。

您的执行时间起初会有很大差异,但稍后会收敛到更一致的值。您始终可以按 运行 时间排序并找到第 95 个百分位数,即程序在 95% 的时间内 运行s 的时间。