C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别
生活随笔
收集整理的這篇文章主要介紹了
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
理由是:?提供了類型安全的機制防止用戶進行單位換算的時候出錯;但是這兩個函數是例外的,起到“緊急出口的作用”,
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++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于CAD/CAM的三维控件
- 下一篇: 4399赛尔号尼尔在哪抓 4399赛尔号