基于C++實(shí)現(xiàn)高精度計(jì)時(shí)器
在調(diào)試程序的時(shí)候,有時(shí)需要知道程序語(yǔ)句執(zhí)行的耗時(shí)。特別是比較算法性能的時(shí)候,對(duì)耗時(shí)的精度要求較高。chrono是C++ 11中的時(shí)間庫(kù),它提供了跨平臺(tái)的高精度時(shí)鐘解決方案,精確到納秒級(jí)。
一.時(shí)間點(diǎn)和時(shí)鐘
chrono庫(kù)頭文件中所有函數(shù)與類模板均定義在std::chrono命名空間中;
這里主要介紹時(shí)間點(diǎn)和時(shí)鐘兩個(gè)概念:
一般計(jì)時(shí)器就是從某個(gè)時(shí)間點(diǎn)開(kāi)始,然后到某個(gè)時(shí)間點(diǎn)之間的計(jì)數(shù),就是我們一般稱之為耗時(shí)。
1.時(shí)間點(diǎn)
template <class Clock, class Duration = typename Clock::duration> class time_point;
std::chrono::time_point 表示一個(gè)具體時(shí)間。
第一個(gè)模板參數(shù)Clock用來(lái)指定所要使用的時(shí)鐘,在標(biāo)準(zhǔn)庫(kù)中有三種時(shí)鐘,分別為:
● system_clock:當(dāng)前系統(tǒng)范圍(即對(duì)各進(jìn)程都一致)的一個(gè)實(shí)時(shí)的日歷時(shí)鐘(wallclock)
● steady_clock:當(dāng)前系統(tǒng)實(shí)現(xiàn)的一個(gè)穩(wěn)定時(shí)鐘,該時(shí)鐘的每個(gè)時(shí)間嘀嗒單位是均勻的(即長(zhǎng)度相等)
● high_resolution_clock:當(dāng)前系統(tǒng)實(shí)現(xiàn)的一個(gè)高分辨率時(shí)鐘。
第二個(gè)模板函數(shù)參數(shù)用來(lái)表示時(shí)間的計(jì)量單位(特化的std::chrono::duration<> )
時(shí)間點(diǎn)都有一個(gè)時(shí)間戳,即時(shí)間原點(diǎn)。chrono庫(kù)中采用的是Unix的時(shí)間戳1970年1月1日 00:00。所以time_point也就是距離時(shí)間戳(epoch)的時(shí)間長(zhǎng)度(duration)。
2.時(shí)鐘
下面用demo測(cè)試一下上面三種時(shí)鐘的精度
#include <iostream> #include <chrono> using namespace std; using namespace std::chrono; int main() { cout << "system clock : "; cout << system_clock::period::num << "/" << system_clock::period::den << " s" << endl; cout << "steady clock : "; cout << steady_clock::period::num << "/" << steady_clock::period::den << " s" << endl; cout << "high resolution clock : "; cout << high_resolution_clock::period::num << "/" << high_resolution_clock::period::den << " s" << endl; return 0; }
可以看到在我的電腦上,這三種時(shí)鐘的精度是一樣的,都是1納秒。但一般來(lái)說(shuō)system_clock的精度是100納秒,而high_resolution的精度是1納秒,對(duì)于程序來(lái)說(shuō),一般微秒級(jí)就夠了,所以說(shuō)chrono提供的時(shí)鐘精度綽綽有余。
二.計(jì)時(shí)器的實(shí)現(xiàn)
#include <iostream> #include <chrono> using namespace std; using namespace std::chrono; class HighResolutionClock { public: HighResolutionClock() { update(); } ~HighResolutionClock() { } void update() { m_start = high_resolution_clock::now(); } // 秒 double getSecond() { return getMicroSec() * 0.000001; } // 毫秒 double getMilliSec() { return getMicroSec()*0.001; } // 微妙 long long getMicroSec() { // 如果你愿意,也可以用nanoseconds獲取納秒,其實(shí)微秒已經(jīng)夠用了 return duration_cast<microseconds>(high_resolution_clock::now() - m_start).count(); } private: time_point<high_resolution_clock> m_start; }; int main(int argc, char *argv[]) { HighResolutionClock hrClock; int sum = 0; hrClock.update(); for (int i = 0; i < 100000; i++) { sum++; } cout << "cost time: " << hrClock.getMilliSec() <<" ms"<< endl; cout << "cost time: " << hrClock.getMicroSec() <<" us" << endl; return 0; }
到此這篇關(guān)于基于C++實(shí)現(xiàn)高精度計(jì)時(shí)器的文章就介紹到這了,更多相關(guān)C++計(jì)時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)json形式的Socket傳輸圖片
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)json形式的Socket傳輸圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C字符串操作函數(shù)的實(shí)現(xiàn)詳細(xì)解析
以下是對(duì)C語(yǔ)言中字符串操作函數(shù)的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08C語(yǔ)言動(dòng)態(tài)內(nèi)存管理深入探討
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-06-06C++控制臺(tái)實(shí)現(xiàn)密碼管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)密碼管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11詳解C語(yǔ)言中的getgrgid()函數(shù)和getgrnam()函數(shù)
這篇文章主要介紹了詳解C語(yǔ)言中的getgrgid()函數(shù)和getgrnam()函數(shù),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08OpenSSL動(dòng)態(tài)鏈接庫(kù)源碼安裝教程
Openssl 是一個(gè)開(kāi)放源代碼的SSL協(xié)議的產(chǎn)品實(shí)現(xiàn),它采用C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言,具備了跨系統(tǒng)的性能。這篇文章主要介紹了OpenSSL動(dòng)態(tài)鏈接庫(kù)源碼安裝,需要的朋友可以參考下2021-11-11