首页 > 解决方案 > 设定行为的推理

问题描述

在我们的一个大学项目中,我们正在开展一个基准项目。我们本质上所做的是生成一个随机编号。然后将其插入到 std::set (RBTree) 中,然后将其删除。我们在特定的时间间隔内执行此操作。本质上这就是代码的样子

auto randomNo = std::random_device{}();

//Measure insertion
auto start = std::chrono::steady_clock::now();
myset.insert(randomNo ); //log(n)
auto end = std::chrono::steady_clock::now();
auto difference = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
//record the diff.

//Measure erasures
start = std::chrono::steady_clock::now();
myset.erase(randomNum); //log(n)
end = std::chrono::steady_clock::now();
difference = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
//record the diff.

知道为什么在一些新的运行中插入和删除需要比平常更多的时间吗?

标签: c++c++11

解决方案


这里有几件事出错:

  • 您只测量一次插入或擦除。您应该尝试测量执行十万个条目所需的时间并取平均值。
  • 你没有进行任何热身。设置操作可能使用冷 CPU 缓存进行操作,如果标准库需要从操作系统请求一块内存,则下一次内存分配可能无法满足,等等。在开始实际测量之前,尝试运行一个循环来执行十万次迭代的操作。
  • 您的进程可能不会不间断地运行。您的计算机上正在运行许多进程,可能是操作系统决定暂停您的进程一段时间,让另一个进程有机会运行。如果在录制start和之间发生这种情况stop,您的操作看起来会花费很长时间。
  • 如今,大多数 CPU 一直在改变它们的运行频率,以提高能效并保持凉爽。可能是在某些运行中,CPU 频率与其他运行不同。有一个热身阶段和平均许多操作将有助于减轻这种影响。

我建议您开始使用现有的基准测试库来执行此类性能测试,例如Google Benchmark。通常这些库已经为您解决了其中的一些问题。


推荐阅读