C++chronoライブラリのsteady_clockとsystem_clock

4139 ワード

C++11には、タイマの標準ライブラリが提供される.3種類の時計が入っていますclock, system_clockとhigh_resolution_clock;
区別する
  • steady_clockは単調な時計で、コーチの手の中の秒時計に相当します.増加するだけで、プログラムを記録するのに時間がかかります.
  • system_clockはシステムのクロックです.システムの時計は修正できるからです.ネットで時間を合わせることもできます.だからシステム時間で時間差を計算するのは正確ではないかもしれません.
  • high_resolution_clockは、現在のシステムが提供できる最高精度のクロックである.修正することはできません.steadyに相当clockの高精度バージョン.

  • リファレンスリンク[2]には、自分のマシン上の3種類のクロックの時間精度を表示できるコードが提供されている.
    // copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;
    // Author: Nicolai M. Josuttis
    
    #include 
    #include 
    #include 
    
    template 
    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

    ::value) { // convert to and print as milliseconds typedef typename ratio_multiply

    ::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<:chrono::system_clock>(); std::cout << "
    high_resolution_clock: " << std::endl; printClockData<:chrono::high_resolution_clock>(); std::cout << "
    steady_clock: " << std::endl; printClockData<: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です.
  • できるだけcount()メソッド
  • を使用しないでください.
  • できるだけtime_since_epoch()
  • を使用しないでください.
    理由は、タイプの安全なメカニズムを提供し、ユーザーが単位換算を行う際のエラーを防止することである.しかし、この2つの関数は例外で、「非常口の役割」を果たしています.
    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 
    
    #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<:chrono::seconds>(tag##_end - tag##_start).count()) #define DURATION_ms(tag) printf("%s costs %d ms
    ",#tag,std::chrono::duration_cast<:chrono::milliseconds>(tag##_end - tag##_start).count()); #define DURATION_us(tag) printf("%s costs %d us
    ",#tag,std::chrono::duration_cast<:chrono::microseconds>(tag##_end - tag##_start).count()); #define DURATION_ns(tag) printf("%s costs %d ns
    ",#tag,std::chrono::duration_cast<: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);

    リファレンス
  • https://stackoverflow.com/questions/31552193/difference-between-steady-clock-vs-system-clock
  • C++ Stardard Library:A Tutorial and Reference, 2nd Edition