文章目錄
-
- 1. radio
-
- 原型
- 作用
- 示例
- 2. duration
-
- 原型:
- 作用
- 示例
- 3. time_point
-
- 原型
- 作用
- 示例
- 4. clocks
-
- system_clock
-
- 示例
- steady_clock
-
- 示例
- high_resolution_clock
先說感覺,這個庫真惡心,剛接觸感覺跟shi一樣,特别是那個命名空間,太長了。
就像這樣:
後來感覺設計還挺巧妙,才覺得看起來順眼一些。
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計時
示例
- 列印
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
- 轉換
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全面解析(最高可達納秒級别的精度)