zoukankan      html  css  js  c++  java
  • C++ chrono 库中的 steady_clock 和 system_clock

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

    区别

    • 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 << "
    high_resolution_clock: " << std::endl;
        printClockData<std::chrono::high_resolution_clock>();
        std::cout << "
    steady_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()

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

    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 或者与其他 通过整数传参数的时间函数接口中使用。

    使用方法

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

    
    #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
    ",#tag,std::chrono::duration_cast<std::chrono::seconds>(tag##_end - tag##_start).count())
    #define DURATION_ms(tag) printf("%s costs %d ms
    ",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count());
    #define DURATION_us(tag) printf("%s costs %d us
    ",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count());
    #define DURATION_ns(tag) printf("%s costs %d ns
    ",#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
  • 相关阅读:
    vs2008 服务器控件库
    dropdoenlist 设置默认值
    .NET用HttpFileCollection实现多文件上传
    dropdownlist 绑定
    简单的webservice调用(天气预报)
    统计在线人数
    多文件上传
    dropdownlist1 绑定 value值
    WMI 脚本入门:第一部分 (MSDN)
    WMI 脚本入门:第三部分 (MSDN)
  • 原文地址:https://www.cnblogs.com/sunchaothu/p/10551344.html
Copyright © 2011-2022 走看看