首页 > 解决方案 > 两个随之而来的 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动态链接。

标签: c++linuxchrono

解决方案


只是不要将时钟用于纳秒基准。取而代之的是,使用 CPU 滴答声——在任何足以担心纳秒的现代硬件上,CPU 滴答声是单调的、稳定的并且在内核之间是同步的。

不幸的是,C++ 没有公开 CPU 滴答时钟,因此您必须直接使用 RDTSC 指令(它可以很好地包裹在内联函数中,或者您可以使用编译器的内在函数)。如果您愿意(通过使用 CPU 频率),CPU 滴答数的差异也可以转换为时间,但通常对于这样的低延迟基准测试,这是没有必要的。


推荐阅读