基于C++實(shí)現(xiàn)高精度計(jì)時器
在調(diào)試程序的時候,有時需要知道程序語句執(zhí)行的耗時。特別是比較算法性能的時候,對耗時的精度要求較高。chrono是C++ 11中的時間庫,它提供了跨平臺的高精度時鐘解決方案,精確到納秒級。
一.時間點(diǎn)和時鐘
chrono庫頭文件中所有函數(shù)與類模板均定義在std::chrono命名空間中;
這里主要介紹時間點(diǎn)和時鐘兩個概念:
一般計(jì)時器就是從某個時間點(diǎn)開始,然后到某個時間點(diǎn)之間的計(jì)數(shù),就是我們一般稱之為耗時。
1.時間點(diǎn)
template <class Clock, class Duration = typename Clock::duration> class time_point;
std::chrono::time_point 表示一個具體時間。
第一個模板參數(shù)Clock用來指定所要使用的時鐘,在標(biāo)準(zhǔn)庫中有三種時鐘,分別為:
● system_clock:當(dāng)前系統(tǒng)范圍(即對各進(jìn)程都一致)的一個實(shí)時的日歷時鐘(wallclock)
● steady_clock:當(dāng)前系統(tǒng)實(shí)現(xiàn)的一個穩(wěn)定時鐘,該時鐘的每個時間嘀嗒單位是均勻的(即長度相等)
● high_resolution_clock:當(dāng)前系統(tǒng)實(shí)現(xiàn)的一個高分辨率時鐘。
第二個模板函數(shù)參數(shù)用來表示時間的計(jì)量單位(特化的std::chrono::duration<> )
時間點(diǎn)都有一個時間戳,即時間原點(diǎn)。chrono庫中采用的是Unix的時間戳1970年1月1日 00:00。所以time_point也就是距離時間戳(epoch)的時間長度(duration)。
2.時鐘
下面用demo測試一下上面三種時鐘的精度
#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;
}
可以看到在我的電腦上,這三種時鐘的精度是一樣的,都是1納秒。但一般來說system_clock的精度是100納秒,而high_resolution的精度是1納秒,對于程序來說,一般微秒級就夠了,所以說chrono提供的時鐘精度綽綽有余。
二.計(jì)時器的實(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ì)時器的文章就介紹到這了,更多相關(guān)C++計(jì)時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio添加第三方庫的實(shí)現(xiàn)步驟
使用Visual Studio編寫C語言程序能夠提供全面而強(qiáng)大的開發(fā)環(huán)境,本文主要介紹了Visual Studio添加第三方庫的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
C++動態(tài)內(nèi)存分配(new/new[]和delete/delete[])詳解
這篇文章主要介紹了C++動態(tài)內(nèi)存分配(new/new[]和delete/delete[])詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
C++實(shí)現(xiàn)RSA加密解密算法是示例代碼
非對稱加密方式可以使通信雙方無需事先交換密鑰就可以建立安全通信,因此被廣泛應(yīng)用于身份認(rèn)證、數(shù)字簽名、等信息交換領(lǐng)域。其中最具有代表性的非對稱加密方式就是RSA公鑰密碼體制。本文將用C++實(shí)現(xiàn)RSA加密解密算法,需要的可以參考一下2022-09-09
c++如何讀取文件中的內(nèi)容和往文件中寫入數(shù)據(jù)
C++文件流是用于進(jìn)行文件讀寫操作的工具,它提供了一種能夠簡單、高效地與外部文件進(jìn)行交互的方式,這篇文章主要介紹了c++如何讀取文件中的內(nèi)容和往文件中寫入數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
詳解C++程序中定義struct結(jié)構(gòu)體的方法
C++中同樣擁有C語言中的結(jié)構(gòu)體,下面就來詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下2016-05-05

