天天看點

std::chrono筆記

文章目錄

    • 1. radio
      • 原型
      • 作用
      • 示例
    • 2. duration
      • 原型:
      • 作用
      • 示例
    • 3. time_point
      • 原型
      • 作用
      • 示例
    • 4. clocks
      • system_clock
        • 示例
      • steady_clock
        • 示例
      • high_resolution_clock

先說感覺,這個庫真惡心,剛接觸感覺跟shi一樣,特别是那個命名空間,太長了。

就像這樣:

std::chrono筆記

後來感覺設計還挺巧妙,才覺得看起來順眼一些。

1. radio

原型

作用

時間換算的比率 / 表示時間精度。

ratio

是一個比率的模闆(分子/分母)。第一個模闆參數是分子,第二個模闆參數是分母,也可以隻提供第一個,這樣分母預設是0。主要用來表示精度、

可以把它當成一個分數,僅有

ratio

我們是做不了什麼的。

示例

std::ratio<60, 1> minute;
	std::ratio<1, 1> second;
	std::ratio<1, 1000> millisecond;
           

當然,頭檔案有預定義的例子,可以參考:

typedef ratio<1,       1000000000000000000> atto;
  typedef ratio<1,          1000000000000000> femto;
  typedef ratio<1,             1000000000000> pico;
  typedef ratio<1,                1000000000> nano;
  typedef ratio<1,                   1000000> micro;
  typedef ratio<1,                      1000> milli;
  typedef ratio<1,                       100> centi;
  typedef ratio<1,                        10> deci;
  typedef ratio<                       10, 1> deca;
  typedef ratio<                      100, 1> hecto;
  typedef ratio<                     1000, 1> kilo;
  typedef ratio<                  1000000, 1> mega;
  typedef ratio<               1000000000, 1> giga;
  typedef ratio<            1000000000000, 1> tera;
  typedef ratio<         1000000000000000, 1> peta;
  typedef ratio<      1000000000000000000, 1> exa;
           

2. duration

原型:

構造函數(想快點了解話,主要看第4個):

(1)duration() = default;    //預設構造
(2)duration (const duration& dtn);        //(2)(3)拷貝構造
(3)template<class Rep2, class Period2>
   constexpr duration (const duration<Rep2,Period2>& dtn);
(4)template<class Rep2>      //傳遞一個某類型(int等)的數值,構造一個時間段   
   constexpr explicit duration (const Rep2& n);
           

作用

表示一段時間。

第一個模闆參數

Rep

可以是int、float、double,第二個模闆參數

Period

用來表示精度。

Rep

表示

Period

的數目。

duration

模闆中的方法

count

用來傳回

Period

的數量,傳回值是

Rep

類型。

不同類型的

duration

之間的轉換用

duration_cast<>

,原型如下:

template <class ToDuration, class Rep, class Period>
constexpr ToDuration
duration_cast (const duration<Rep,Period>& dtn);
           

示例

#include <iostream>
#include <chrono>
#include <ctime>

using namespace std;
using namespace chrono;

int main (void)
{
	using seconds_type = duration<int, ratio<1, 1>>;
	using minutes_type = duration<int, ratio<60, 1>>;
	using hours_type = duration<int, ratio<3600, 1>>;
	using milliseconds_type = duration<int, ratio<1, 1000>>;
	
	seconds_type oneday_seconds (3600 * 24);
	hours_type oneday_hours (24);
	minutes_type oneday_minutes (60 * 24);
	milliseconds_type oneday_milliseconds (3600 * 24 * 1000);
	cout << "一天的秒數: " << oneday_seconds.count() << endl;
	cout << "一天的小時數: " << oneday_hours.count() << endl;
	cout << "一天的分鐘數: " << oneday_minutes.count() << endl;
	cout << "一天的毫秒數: " << oneday_milliseconds.count() << endl;
	
	hours_type oneday_hours_from_milliseconds = duration_cast<hours_type> (oneday_milliseconds);
	hours_type oneday_hours_from_seconds = duration_cast<hours_type> (oneday_seconds);
	hours_type oneday_hours_from_miniues = duration_cast<hours_type> (oneday_minutes);
	cout << "轉換後>>" << endl;
	cout << "一天的小時數:" << oneday_hours_from_milliseconds.count() << endl;
	cout << "一天的小時數:" << oneday_hours_from_seconds.count() << endl;
	cout << "一天的小時數:" << oneday_hours_from_miniues.count() << endl;
	
	cout << "一天的秒數:" << duration_cast<seconds_type> (oneday_milliseconds).count() << endl;
	cout << "一天的秒數:" << duration_cast<seconds_type> (oneday_minutes).count() << endl;
	cout << "一天的秒數:" << duration_cast<seconds_type> (oneday_hours).count() << endl;
	
	cout << "一天的毫秒數:" << duration_cast<milliseconds_type> (oneday_seconds).count() << endl;
	cout << "一天的毫秒數:" << duration_cast<milliseconds_type> (oneday_minutes).count() << endl;
	cout << "一天的毫秒數:" << duration_cast<milliseconds_type> (oneday_hours).count() << endl;
}
           

列印結果:

一天的秒數: 86400
一天的小時數: 24
一天的分鐘數: 1440
一天的毫秒數: 86400000
轉換後>>
一天的小時數:24
一天的小時數:24
一天的小時數:24
一天的秒數:86400
一天的秒數:86400
一天的秒數:86400
一天的毫秒數:86400000
一天的毫秒數:86400000
一天的毫秒數:86400000
           

也可以用頭檔案中預定義的:

/// nanoseconds
    using nanoseconds	= duration<_GLIBCXX_CHRONO_INT64_T, nano>;
    /// microseconds
    using microseconds	= duration<_GLIBCXX_CHRONO_INT64_T, micro>;
    /// milliseconds
    using milliseconds	= duration<_GLIBCXX_CHRONO_INT64_T, milli>;
    /// seconds
    using seconds	= duration<_GLIBCXX_CHRONO_INT64_T>;
    /// minutes
    using minutes	= duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;
    /// hours
    using hours		= duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;
   ...
   ...
           

3. time_point

原型

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

另外看一下

system_clock

中内容:

struct system_clock
    {
      typedef chrono::nanoseconds				duration;
      typedef duration::rep					rep;
      typedef duration::period					period;
      typedef chrono::time_point<system_clock, duration> 	time_point;

		...
           

标準庫有三種鐘:

system_clock

steady_clock

high_resolution_clock

可以看出

system_clock::time_point

預設用的鐘是

system_clock

duration

是納秒級别的

nanoseconds

同時,為了轉換不同的

time_point

,還提供了

time_point_cast

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

           

作用

表示時間點,一個time point必須有一個clock計時

示例

  1. 列印
system_clock::time_point tp_epoch;
	
	time_point<system_clock, seconds> tp_seconds (seconds (1));
	time_point<
	//預設的time_point是納米級:
	system_clock::time_point tp (tp_seconds);
	
	printf ("system_clock中,一秒對應%d個時鐘周期\n",
			 tp.time_since_epoch().count() );
	
	system_clock::time_point
	time_t time = system_clock::to_time_t (tp);
	printf ("tp的列印結果:%s", ctime (&time));
           

列印結果:

system_clock中,一秒對應1000000000個時鐘周期
tp的列印結果:Thu Jan  1 08:00:01 1970
           
  1. 轉換
using days_type = duration<int, ratio<3600 * 24>>;
	time_point<system_clock, days_type> today
	    = time_point_cast<days_type> (system_clock::now());
	printf ("從epoch到現在的天數: %d", today.time_since_epoch().count());
           

列印結果:

到這裡應該更能體會到,那個

ratio<3600 * 24>

,表示一個機關,

int

其實是機關的數量,整體看起來就是一段時間,隻不過這段時間的精度是按天來算的,且數目是

int

類型。

4. clocks

system_clock

system_clock

表示目前的系統時鐘,系統中運作的所有程序使用

now()

得到的時間是一緻的。

每一個clock類中都有确定的

time_point

,

duration

,

Rep

,

Period

類型。

操作有:

  • now()

    • 目前時間

      time_point

  • to_time_t()

    • time_point

      轉換成

      time_t

  • from_time_t()

    • time_t

      轉換成

      time_poin

示例

計算時間日期

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>

using namespace std;
using namespace chrono;

int main (void)
{
	using days_type = duration<int, ratio<3600 * 24>>;
	days_type one_day (1);
	
	system_clock::time_point today = system_clock::now();
	system_clock::time_point tomorrow = today + one_day;
	
	time_t time = system_clock::to_time_t (today);
	printf ("今天是:%s", ctime (&time));
	time = system_clock::to_time_t (tomorrow);
	printf ("明天是:%s", ctime (&time));
}
           

steady_clock

steady_clock

為了表示穩定的時間間隔,後一次調用

now()

得到的時間總是比前一次的值大(這句話的意思其實是,如果中途修改了系統時間,也不影響

now()

的結果),每次

tick

都保證過了穩定的時間間隔。

操作有:

  • now()

    • 擷取目前時鐘

示例

典型的應用是給算法計時。

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>

using namespace std;
using namespace chrono;

int main (void)
{
	steady_clock::time_point t1 = steady_clock::now();
	cout << "列印1000個 *" << endl;
	
	for (int i = 0; i < 1000; ++i)
		cout << "*";
	cout << endl;
	steady_clock::time_point t2 = steady_clock::now();
	
	duration<double> time = duration_cast<duration<double>> (t2 - t1);
	cout << "花費的秒數:" << time.count() << endl;
}
           
*************************************...
花費的秒數:9.3816e-05
           

high_resolution_clock

最後一個時鐘,

high_resolution_clock

顧名思義,這是系統可用的最高精度的時鐘。實際上

high_resolution_clock

隻不過是

system_clock

或者

steady_clock

typedef

操作有:

  • now()

    • 擷取目前時鐘。

參考部落格:

C++11 std::chrono庫詳解

c++11 chrono全面解析(最高可達納秒級别的精度)

繼續閱讀