• 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
  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    70. Climbing Stairs
    647. Palindromic Substrings
    609. Find Duplicate File in System
    583. Delete Operation for Two Strings
    556 Next Greater Element III
    553. Optimal Division
    539. Minimum Time Difference
    537. Complex Number Multiplication
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/sunchaothu/p/10551344.html
Copyright © 2020-2023  润新知