C++11库中 steady_clock , system_clock和high_resolution_clock的区别
C++11 中提供了一個計時的標(biāo)準(zhǔn)庫?<chrono>;
里面有三種時鐘 clock: steady_clock, system_clock 和 high_resolution_clock;
區(qū)別
- steady_clock 是單調(diào)的時鐘,相當(dāng)于教練手中的秒表;只會增長,適合用于記錄程序耗時;
- system_clock 是系統(tǒng)的時鐘;因為系統(tǒng)的時鐘可以修改;甚至可以網(wǎng)絡(luò)對時; 所以用系統(tǒng)時間計算時間差可能不準(zhǔn)。
- high_resolution_clock 是當(dāng)前系統(tǒng)能夠提供的最高精度的時鐘;它也是不可以修改的。相當(dāng)于 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
理由是: 提供了類型安全的機制防止用戶進行單位換算的時候出錯;但是這兩個函數(shù)是例外的,起到“緊急出口的作用”,
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 或者與其他 通過整數(shù)傳參數(shù)的時間函數(shù)接口中使用。
使用方法
例子:一個用來測試代碼段運行時間的宏
#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);參考
轉(zhuǎn)載于:https://www.cnblogs.com/sunchaothu/p/10551344.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的C++11库中 steady_clock , system_clock和high_resolution_clock的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11 新的计时方法——std::c
- 下一篇: push_back和emplace_ba