C++11時間日期庫chrono簡介

時鐘與時間點

時間間隔

 

chrono是C++11中新加入的時間日期操作庫,可以方便地進行時間日期操作,主要包含了:duration, time_point, clock。

時鐘與時間點

chrono中用time_point模板類表示時間點,其支持基本算術操作;不同時鐘clock分別返回其對應類型的時間點。

clock

時鐘是從一個時點開始,按照某個刻度的計數;chrono同時提供了三種時鐘(通過now()獲取當前時間點):

  • system_clock:系統時鐘,相對epoch(1970-01-01 00:00:00UTC)的時間間隔;
  • steady_clock:單調時鐘,只能增長(後一次調用now()得到的時間總是比前一次的值大);一般是相對於系統啓動時間的時間間隔;
  • high_resolution_clock:高精度時鐘(當前系統能提供的最高精度時鐘,很可能就是steady_clock),也是單調的;

需要得到絕對時點的場景使用system_clock;需要得到時間間隔,且不受系統時間修改而受影響時使用steady_clock。

時間顯示

在C++20中直接有to_stream直接輸出system_clock時鐘;但在此之前,只能通過間接的方式來輸出:

auto tNow = system_clock::now();
auto tmNow = system_clock::to_time_t(tNow);
auto locNow = std::localtime(&tmNow);
cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12

system_clock::from_time_t(...)可以把time_t類型時間轉換爲time_point,便於chrono使用。

運行計時

通過steady_clock/high_resolution_clock可方便的進行計時:

public:
  explicit XRunTime{bool bStart){
    if(bStart) Restart();
  }

  void Restart(){
    m_tpStart = high_resolution_clock::now();
  }

  double Stop(){
    return operator()();
  }
  double operator()(void){
    auto tpEnd = high_resolution_clock::now();
    auto elap = tpEnd - m_tpStart;
    return (double)elap.count() / std::nano::den; //返回運行的秒數,如1.00345
  }
}

時間間隔duration

chrono中使用duration模板類來表示時間間隔,並定義了從小時到納秒的時間間隔。

duration模板

duration使用一個數值(表示時鐘數)和分數(ratio)來表示具體間隔。支持基本的算術運算,並通過count()獲取具體的時鐘數。

template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
  typedef _Rep   rep;

  constexpr _Rep count() const{
    return (_MyRep);
  }
  ...
private:
  _Rep  _MyRep;  //時鐘計數
};

基準是秒,並依次定義了常用的間隔,如:

typedef duration<long long> seconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long, ratio<3600>> hours;

不同的時間間隔可以直接進行算術運算,如休眠需要毫秒參數,我們可以封裝接收秒與毫秒的接口:

void MySleep(int nSec, int nMillSec){
  std::chrono::seconds secs(nSec);
  std::chrono::milliseconds mills(nMillSec);
  std::this_thread::sleep_for(secs+mills);
}

duration_cast

使用duration_cast可以方便的在不同時間單位間進行轉換,如:

auto sec=seconds(123);
auto minu=duration_cast<minutes>(sec);
cout<<sec.count()<<","<<minu.count()<<endl; // 123,2

ratio

ratio是一個分數模板類,第一個參數爲分子,第二個參數爲分母;通過靜態成員可獲取:

  • num:分子
  • den:分母
typedef ratio<1, 1000> milli;
typedef ratio<1000, 1> kilo;
cout<<milli::den<<endl; // 1000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章