动态

详情 返回 返回

c++的時間管理:chrono庫 - 动态 详情

貼一個解釋得相對詳細的帖子

https://renyili.org/post/std_chrono/

chrono裏面用到了比較多的庫裏自定義的概念,我寫一下學習筆記如下。

庫裏定義了三種時間相關的模板類

1. time_point

第一種表示使用某個計時時鐘類型來記錄的時間點

template<class Clock, class Duration = typename Clock::duration> 
class time_point;

第一個模板參數是問你用的起始計時時鐘是什麼類型(用該時鐘記錄天地初開之混沌原初時刻)
第二個模板參數是用什麼類型記錄“原初起始”到該時刻的時間間隔(實際使用時不提供這個參數,默認是跟隨第一個參數保持一致的時鐘類型)

混沌原初+時間間隔=這個時刻點

用法如下
其中第一個模板參數class Clock 庫裏提供了3種:
1) system_clock
2) steady_clock
3) high_resolution_clock

一個用法示例

std::chrono::time_point<std::chrono::steady_clock> base_tp;
base_tp = std::chrono::steady_clock::now();

std::chrono::time_point<std::chrono::system_clock> base_tp2
base_tp2 = std::chrono::system_clock::now();

2. Duaration

// Rep表示單位的數量單位
// Period表示單位
template<class Rep,  class Period = std::ratio<1>> class duration;

time_point的第二個模板參數類也是由兩個模板類作為參數初始化

一是 Rep,指用於存儲時間間隔的類型,比如32位int 64位double等等。比如如果用太小存儲類型存存納秒就可能會超,要考慮這一點。

二是 Period 時間單位,提示你告訴它單位是秒?毫秒?納秒?還是其他?
但是表示的使用std::ratio的方式,std::ratio也提供兩個模板參,第一個是分子,第二個是分母(默認為1可以不寫)。

  • 比如std::ratio<1,1> 相當於 std::ratio<1> 表示的含義是 1/1 秒
  • 如果表示的單位是毫秒,就要用 std::ratio<1,1000> 表示 1/1000秒 = 毫秒

如果有兩個不同的模板參數定義個Duration類,想要轉換,又因為有精度損失, 不能進行隱式類型轉換,可以用如下庫模板函數強制轉

template <class ToDuration, class Clock, class Duration>
time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration> &t);

3. clock

就是time_period的第一個模板參

steady_clock 是單調的時鐘,相當於教練手中的秒錶;只會增長,適合用於記錄程序耗時;
system_clock 是系統的時鐘;因為系統的時鐘可以修改;甚至可以網絡對時; 所以用系統時間計算時間差可能不準。
high_resolution_clock 是當前系統能夠提供的最高精度的時鐘;它也是不可以修改的

Add a new 评论

Some HTML is okay.