c++ - 两个随之而来的 std::chrono::high_resolution_clock::now() 给出了~270ns的差异
问题描述
我想用时钟测量一段代码的持续时间std::chrono
,但它似乎太重而无法测量持续纳秒的东西。那个程序:
#include <cstdio>
#include <chrono>
int main() {
using clock = std::chrono::high_resolution_clock;
// try several times
for (int i = 0; i < 5; i++) {
// two consequent now() here, one right after another without anything in between
printf("%dns\n", (int)std::chrono::duration_cast<std::chrono::nanoseconds>(clock::now() - clock::now()).count());
}
return 0;
}
总是给我大约100-300ns。这是因为两个系统调用吗?两个 now() 之间的持续时间是否可能更短?谢谢!
环境:Linux Ubuntu 18.04,内核4.18,平均负载低,stdlib动态链接。
解决方案
只是不要将时钟用于纳秒基准。取而代之的是,使用 CPU 滴答声——在任何足以担心纳秒的现代硬件上,CPU 滴答声是单调的、稳定的并且在内核之间是同步的。
不幸的是,C++ 没有公开 CPU 滴答时钟,因此您必须直接使用 RDTSC 指令(它可以很好地包裹在内联函数中,或者您可以使用编译器的内在函数)。如果您愿意(通过使用 CPU 频率),CPU 滴答数的差异也可以转换为时间,但通常对于这样的低延迟基准测试,这是没有必要的。
推荐阅读
- ios - Apple Push Notification (APN) - 何时使用沙盒和生产?
- flutter - 在 Flutter 上加载和保存图像
- algorithm - 如何表示复数的四分函数
- woocommerce - Woocommerce 禁用特定状态的订单号
- vue.js - 如何将我的 v-img 和 v-card 放在 v-flex 中?
- symfony - Symfony 4 - 更新现有实体时如何修复“找不到文件”约束冲突?
- ios - 如何在 iOS 项目中获取项目文件的路径?
- python - 访问作为 Python 中另一个对象中的数组的对象的属性
- javascript - jQuery - 在垂直鼠标滚动时水平移动元素 - 滚动方法不适用于自定义变量
- javascript - 如何将样式默认应用到我的组件