C++ chrono 库中的 steady_clock 和 system_clock

C++11 中提供了一个计时的标准库 <chrono>;
里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;ios

区别

  • steady_clock 是单调的时钟,至关于教练手中的秒表;只会增加,适合用于记录程序耗时
  • system_clock 是系统的时钟;由于系统的时钟能够修改;甚至能够网络对时; 因此用系统时间计算时间差可能不许。
  • high_resolution_clock 是当前系统可以提供的最高精度的时钟;它也是不能够修改的。至关于 steady_clock 的高精度版本。

在 参考连接[2] 中提供了代码,能够查看本身的机器上三种时钟的时间精度。安全

// copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;
// Author: Nicolai M. Josuttis

#include <chrono>
#include <iostream>
#include <iomanip>

template <typename C>
void printClockData ()
{
    using namespace std;

    cout << "- precision: ";
    // if time unit is less or equal one millisecond
    typedef typename C::period P;// type of time unit
    if (ratio_less_equal<P,milli>::value) {
       // convert to and print as milliseconds
       typedef typename ratio_multiply<P,kilo>::type TT;
       cout << fixed << double(TT::num)/TT::den
            << " milliseconds" << endl;
    }
    else {
        // print as seconds
        cout << fixed << double(P::num)/P::den << " seconds" << endl;
    }
    cout << "- is_steady: " << boolalpha << C::is_steady << endl;
}

int main()
{
    std::cout << "system_clock: " << std::endl;
    printClockData<std::chrono::system_clock>();
    std::cout << "\nhigh_resolution_clock: " << std::endl;
    printClockData<std::chrono::high_resolution_clock>();
    std::cout << "\nsteady_clock: " << std::endl;
    printClockData<std::chrono::steady_clock>();

#ifdef _WIN32
    system("pause");
#endif
    return 0;
}
system_clock:
- precision: 0.000100 milliseconds
- is_steady: false

high_resolution_clock:
- precision: 0.000001 milliseconds
- is_steady: true

steady_clock:
- precision: 0.000001 milliseconds
- is_steady: true

建议

如下是 stackoverflow 上一个大佬给出的建议difference between steady clocl vs system clock网络

  1. 尽可能不要使用 count() 方法
  2. 尽可能不要使用 time_since_epoch()

理由是: 提供了类型安全的机制防止用户进行单位换算的时候出错;可是这两个函数是例外的,起到“紧急出口的做用”, less

Such emergencies arise when (for example) the committee neglects to give you all the tools you need to get the job done (such as I/O) for the types, or such as the need to interface with some other timing API via integers 函数

在I/O 或者与其余 经过整数传参数的时间函数接口中使用。oop

使用方法

例子:一个用来测试代码段运行时间的宏测试

#include <chrono>

#define TIMERSTART(tag)  auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start
#define TIMEREND(tag)  tag##_end =  std::chrono::steady_clock::now()
#define DURATION_s(tag) printf("%s costs %d s\n",#tag,std::chrono::duration_cast<std::chrono::seconds>(tag##_end - tag##_start).count())
#define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count());
#define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count());
#define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast<std::chrono::nanoseconds>(tag##_end - tag##_start).count());


// usage:
//   TIMERSTART(for_loop);
//   for (int i = 0; i < 100000; i++)
//   {
//       i*i;
//   }
//   TIMEREND(for_loop);
//   DURATION_ms(for_loop);

参考

  1. https://stackoverflow.com/questions/31552193/difference-between-steady-clock-vs-system-clock
  2. C++ Stardard Library:A Tutorial and Reference, 2nd Edition
相关文章
相关标签/搜索