C++11——chrono庫開發高精度計!我們可能學的不是同一門語言~
一、前言
在我們寫程式過程中,有時候需要測試我們的程式語句執行時間的耗時,當前也是有很多的庫提供我們去使用,一直沒有良好的跨平臺的庫可以提供出來;而且一般這種程式碼也是由我們程式設計師自己呼叫系統的庫來進行,但是往往會出現精度不足和不支援跨平臺等問題;
他來了。。。他來了。。。他踩著七彩祥雲來了;“他”就是C++11中引進boost中的chrono庫;他可實現高精度時鐘,可以做到納秒級;
二、chrono庫
在C++11中,是標準模板庫中與時間有關的標頭檔案。該標頭檔案中所有函式與類模板均定義在std::chrono名稱空間中;
這裡主要介紹時間點和時鐘兩個點:
一般計時器就是從某個時間點開始,然後到某個時間點之間的計數,就是我們一般稱之為耗時;
✁ 時間點:
template <class Clock, class Duration = typename Clock::duration> class time_point; std::chrono::time_point 表示一個具體時間
第一個模板引數Clock用來指定所要使用的時鐘,在標準庫中有三種時鐘,分別為:
●system_clock:當前系統範圍(即對各程序都一致)的一個實時的日曆時鐘(wallclock)
●steady_clock:當前系統實現的一個維定時鐘,該時鐘的每個時間嘀嗒單位是均勻的(即長度相等)。
●high_resolution_clock:當前系統實現的一個高解析度時鐘。
第二個模板函式引數用來表示時間的計量單位(特化的std::chrono::duration<> )
時間點都有一個時間戳,即時間原點。chrono庫中採用的是Unix的時間戳1970年1月1日 00:00。所以time_point也就是距離時間戳(epoch)的時間長度(duration)。
三、實踐
知道了這些,我們去實現一下開始說的~
✍ 高精度計時器:
#ifndef _TimerClock_hpp_ #define _TimerClock_hpp_ #include <iostream> #include <chrono> usingnamespace std; using namespace std::chrono; class TimerClock { public: TimerClock() { update(); } ~TimerClock() { } void update() { _start = high_resolution_clock::now(); } //獲取秒 double getTimerSecond() { return getTimerMicroSec() * 0.000001; } //獲取毫秒 double getTimerMilliSec() { return getTimerMicroSec()*0.001; } //獲取微妙 long long getTimerMicroSec() { //當前時鐘減去開始時鐘的count return duration_cast<microseconds>(high_resolution_clock::now() - _start).count(); } private: time_point<high_resolution_clock>_start; }; #endif
✍ 測試:
#include "TimerClock.hpp" int main() { TimerClock TC; int sum = 0; TC.update(); for (int i = 0; i > 100000; i++) { sum++; } cout << "cost time:" << TC.getTimerMilliSec() <<"ms"<< endl; cout << "cost time:" << TC.getTimerMicroSec() << "us" << endl; return 0; }
✍ 結果:
類似這種比較高精度的測試,我們可以使用在我們專案程式碼中進行使用,可以計算出我們程式的耗時,可以進行優化;
想了解學習更多C++方面的知識,可以關注我哦,帶你學習程式設計,帶你飛!
看到這裡是不是又學到了很多新知識呢~
如果你很想學程式設計,小編推薦我的C語言/C++程式設計學習基地【點選進入】!
都是學程式設計小夥伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
還有許多學習資料和視訊,相信你會喜歡的!
涉及:遊戲開發、常用軟體開發、程式設計基礎知識、課程設計、黑客等等......