日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别

發布時間:2023/12/15 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_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 millisecondtypedef typename C::period P;// type of time unitif (ratio_less_equal<P,milli>::value) {// convert to and print as millisecondstypedef typename ratio_multiply<P,kilo>::type TT;cout << fixed << double(TT::num)/TT::den<< " milliseconds" << endl;}else {// print as secondscout << 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 _WIN32system("pause"); #endifreturn 0; } system_clock: - precision: 0.000100 milliseconds - is_steady: falsehigh_resolution_clock: - precision: 0.000001 milliseconds - is_steady: truesteady_clock: - precision: 0.000001 milliseconds - is_steady: true

建議

以下是 stackoverflow 上一個大佬給出的建議difference between steady clocl vs system clock

  • 盡量不要使用?count()?方法
  • 盡量不要使用?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\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);

    參考

  • c++ - Difference between steady_clock vs system_clock? - Stack Overflow
  • C++ Stardard Library:A Tutorial and Reference, 2nd Edition
  • 總結

    以上是生活随笔為你收集整理的C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。