c++ - 设定行为的推理
问题描述
在我们的一个大学项目中,我们正在开展一个基准项目。我们本质上所做的是生成一个随机编号。然后将其插入到 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.
知道为什么在一些新的运行中插入和删除需要比平常更多的时间吗?
解决方案
这里有几件事出错:
- 您只测量一次插入或擦除。您应该尝试测量执行十万个条目所需的时间并取平均值。
- 你没有进行任何热身。设置操作可能使用冷 CPU 缓存进行操作,如果标准库需要从操作系统请求一块内存,则下一次内存分配可能无法满足,等等。在开始实际测量之前,尝试运行一个循环来执行十万次迭代的操作。
- 您的进程可能不会不间断地运行。您的计算机上正在运行许多进程,可能是操作系统决定暂停您的进程一段时间,让另一个进程有机会运行。如果在录制
start
和之间发生这种情况stop
,您的操作看起来会花费很长时间。 - 如今,大多数 CPU 一直在改变它们的运行频率,以提高能效并保持凉爽。可能是在某些运行中,CPU 频率与其他运行不同。有一个热身阶段和平均许多操作将有助于减轻这种影响。
我建议您开始使用现有的基准测试库来执行此类性能测试,例如Google Benchmark。通常这些库已经为您解决了其中的一些问题。
推荐阅读
- azure-active-directory - 如何在 24 小时后强制执行 MFA 会话到期
- visual-studio-code - 是否可以检测 VS Code 何时处于活动/非活动状态一段时间?
- python - 在 Python 中绘制 2 级 NEXRAD 雷达数据 - TypeError:“MaskedArray”对象不可调用
- python - 在 Panda 中对聚合值进行排序
- cloud - oracle erp云应用中如何识别表名
- c# - Linq忽略OrderBy中的空格
- c# - 继承泛型不能向上转换
- css - 尝试使用 node.js 编译 sass 文件时收到错误消息
- react-native - 访问样式属性并更改它
- visual-studio-code - 按 shift + * 时如何在 VSCodeVim 中使用搜索词设置高亮显示