C++11 中提供了一個計時的標準庫 <chrono>
;
裏面有三種時鐘 clock: steady_clock, system_clock 和 high_resolution_clock;ios
在 參考連接[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 << "\nhigh_resolution_clock: " << std::endl; printClockData<std::chrono::high_resolution_clock>(); std::cout << "\nsteady_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網絡
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 或者與其餘 經過整數傳參數的時間函數接口中使用。oop
例子:一個用來測試代碼段運行時間的宏測試
#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);