C 11的chrono庫,實現毫秒微秒級定時

2022-06-07 20:24:12 字數 2938 閱讀 2802

c++11有了chrono庫,可以很容易的實現定時功能。

chrono:

chrono庫主要包含了三種型別:時間間隔duration、時鐘clocks和時間點time point。

duration:

duration表示一段時間間隔,用來記錄時間長度,可以表示幾秒鐘、幾分鐘或者幾個小時的時間間隔,duration的原型是:

template> class duration;

第乙個模板引數rep是乙個數值型別,表示時鐘個數;第二個模板引數是乙個預設模板引數std::ratio,它的原型是:

templateclass ratio;

它表示每個時鐘週期的秒數,其中第乙個模板引數num代表分子,denom代表分母,分母預設為1,ratio代表的是乙個分子除以分母的分數值,比如ratio<2>代表乙個時鐘週期是兩秒,ratio<60>代表了一分鐘,ratio<60*60>代表乙個小時,ratio<60*60*24>代表一天。而ratio<1, 1000>代表的則是1/1000秒即一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一納秒。標準庫為了方便使用,就定義了一些常用的時間間隔,如時、分、秒、毫秒、微秒和納秒,在chrono命名空間下,它們的定義如下:

1 typedef duration 3600,1>>hours;

2 typedef duration 60,1>>minutes;

3 typedef duration 1,1>>seconds;

4 typedef duration 1,1000>>milliseconds;

5 typedef duration 1,1000000>>microseconds;

6 typedef duration 1,1000000000>> nanoseconds;

通過定義這些常用的時間間隔型別,我們能方便的使用它們,比如執行緒的休眠:

1 std::this_thread::sleep_for(std::chrono::seconds(3)); //

休眠三秒

2 std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //

休眠100毫秒

time point:

time_point表示乙個時間點,用來獲取1970.1.1以來的秒數和當前的時間, 可以做一些時間的比較和算術運算,可以和ctime庫結合起來顯示時間。time_point必須要clock來計時,time_point有乙個函式time_from_eproch()用來獲得2023年1月1日到time_point時間經過的duration。下面的例子計算當前時間距離2023年1月一日有多少天:

1

"font-size:14px;color:#333333;

">#include 2 #include 3 #include 4

intmain ()

5

clocks:

表示當前的 系統時鐘,內部有time_point, duration, rep, period等資訊,它主要用來獲取當前時間,以及實現time_t和time_point的相互轉換。clocks包含三種時鐘: 

system_clock:從系統獲取的時鐘;

steady_clock:不能被修改的時鐘;

high_resolution_clock:高精度時鐘,實際上是system_clock或者steady_clock的別名。

可以通過now()來獲取當前時間點:

1 #include 2 #include 3

intmain()

4

通過時鐘獲取兩個時間點之相差多少個時鐘週期,我們可以通過duration_cast將其轉換為其它時鐘週期的duration:

cout << std::chrono::duration_cast( t2-t1 ).count() <<」 microseconds」<< endl;

system_clock的to_time_t方法可以將乙個time_point轉換為ctime,而from_time_t方法則是相反的,它將ctime轉換為time_point:

std::time_t now_c = std::chrono::system_clock::to_time_t(time_point);

可以利用high_resolution_clock來實現乙個類似於boost.timer的定時器,這樣的timer在測試效能時會經常用到,經常用它來測試函式耗時,可實現毫秒微秒級定時,它的基本用法是這樣的:

1 #include2

usingnamespace std;

3usingnamespace std::chrono;

4classtimer58

void reset() 9//

預設輸出毫秒

10 int64_t elapsed() const

1114

//微秒

15 int64_t elapsed_micro() const16

19//

納秒20 int64_t elapsed_nano() const

2124//秒

25 int64_t elapsed_seconds() const

2629//分

30 int64_t elapsed_minutes() const

3134//時

35 int64_t elapsed_hours() const

3639

private

:40 time_pointm_begin;

41 };

測試**:

1

void

fun()25

intmain()

6

C 11 毫秒時間

計時有很多用途,比如 測試某一段 的執行時間,時間越短,則效能相對越高。計時有很多方法,我將首先給出我以前常用的一種計時方法,然後給出我認為的最佳方法 採用了c 11的標準技術 首先給出我以前常用的一種 傳統 的計時方法 include using namespace std clock t sta...

基於c 11 的filesystem庫

一般程式設計都有訪問檔案系統的需求,什麼列出目錄啦,刪除,建立目錄啦,自己寫老費勁了,又要考慮跨平台實現,費心傷神。c 17把這個給統一了,加了個filesystem,但是對於不想用或不能用c 17的人就麻煩了。這裡有個輪子可以拿去用,基於c 11實現,與c 17相容。非常好用。使用示例 參見需要注...

c 11多執行緒庫

建立執行緒的四種方法 執行緒類的建構函式是變參建構函式,第乙個引數是執行緒函式,後面的引數為執行緒函式的引數 引數通過值傳遞方式,若要引用傳遞須加std ref thread t1 counter,1,6 void counter int,int class counter 實現 operator ...