使用C++ 11进行便携式计时代码的正确方法

Sar*_* T. 7 c++ benchmarking timing c++11

我正在为一部分具有低延迟要求的程序编写一些时序代码.

看看std :: chrono库中可用的内容,我发现编写可移植的定时代码有点困难.

  1. 的std ::时辰:: high_resolution_clock
  2. 的std ::时辰:: steady_clock
  3. 的std ::时辰:: SYSTEM_CLOCK

system_clock没用,因为它不稳定,其余两个时钟都有问题.

high_resolution_clock在所有平台上都不一定稳定.

steady_clock不一定支持细粒度分辨率时间段(例如:纳秒)

为了我的目的,有一个稳定的时钟是最重要的要求,我可以通过微秒粒度来解决.

我的问题是,如果有人想要在不同的h/w体系结构和操作系统上运行的时间代码 - 什么是最好的选择?

How*_*ant 5

使用steady_clock.在所有实现中,其精度为纳秒.您可以通过打印出检查这个自己所用平台steady_clock::period::numsteady_clock::period::den.

现在这并不意味着它实际上会测量纳秒精度.但平台会尽力而为.对我来说,连续两次调用steady_clock(启用优化)将报告相隔100ns的时间.

#include "chrono_io.h"
#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    using namespace date;
    auto t0 = steady_clock::now();
    auto t1 = steady_clock::now();
    auto t2 = steady_clock::now();
    auto t3 = steady_clock::now();
    std::cout << t1-t0 << '\n';
    std::cout << t2-t1 << '\n';
    std::cout << t3-t2 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

上面的示例仅使用这个免费的,开源的,仅限标头的库,以方便格式化持续时间.你可以自己格式化(我很懒).对我来说这只是输出:

287ns
116ns
75ns
Run Code Online (Sandbox Code Playgroud)

因人而异.