c++11時間相關庫(chrono)


以下整理自:https://www.2cto.com/kf/201404/290706.html

chrono 庫主要包含了三種類型:時間間隔 Duration、時鍾 Clocks 和時間點 Time point

duration:

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

duration 的原型是: 

template<class Rep, class Period = std::ratio<1>> class duration;

第一個模板參數Rep是一個數值類型,表示時鍾個數;第二個模板參數是一個默認模板參數std::ratio,它的原型是:

template<std::intmax_t Num, std::intmax_t Denom = 1> class 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 <Rep, ratio<3600,1>> hours;
 2 
 3 typedef duration <Rep, ratio<60,1>> minutes;
 4 
 5 typedef duration <Rep, ratio<1,1>> seconds;
 6 
 7 typedef duration <Rep, ratio<1,1000>> milliseconds;
 8 
 9 typedef duration <Rep, ratio<1,1000000>> microseconds;
10 
11 typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
View Code

通過定義這些常用的時間間隔類型,我們能方便的使用它們,比如線程的休眠:

std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒

std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒

 

chrono 還提供了獲取時間間隔的時鍾周期個數的方法 count()

count 以及 duration 的基本用法:

 1 #include <iostream>
 2 #include <chrono>
 3 using namespace std;
 4 
 5 int main(void) {
 6     std::chrono::milliseconds ms{3};//3毫秒
 7 
 8     std::chrono::microseconds us = 2 * ms;//6000微秒
 9 
10     std::chrono::duration<double, std::ratio<1, 30>> hz(3.5);
11     //hz為3.5個周期時間長度,每個周期為1/30s
12 
13     cout << ms.count() << endl;//3 一個周期為1s
14     cout << us.count() << endl;//6000 一個周期為1us
15     cout << hz.count() << endl;//3.5
16 
17     return 0;
18 }
View Code

 

時間間隔之間可以做運算,比如下面的例子中計算兩端時間間隔的差值:

 1 #include <iostream>
 2 #include <chrono>
 3 using namespace std;
 4 
 5 int main(void) {
 6     std::chrono::minutes t1(10);//10分鍾
 7 
 8     std::chrono::seconds t2( 60 );//60秒
 9 
10     std::chrono::seconds t3 = t1 - t2;
11 
12     //t3 的時間周期為 second
13     std::cout << t3.count() << " second" << std::endl;
14 
15     //通過 duration_cast 將時間周期轉化為 minutes
16     cout << chrono::duration_cast<chrono::minutes>(t3).count() << " minutes" << endl;
17 
18 // 輸出:
19 // 540 second
20 // 9 minutes
21 
22     return 0;
23 }
View Code

注意:我們還可以通過duration_cast<>() 來將當前的時鍾周期轉換為其它的時鍾周期,如我可以把秒的時鍾周期轉換為分鍾的時鍾周期,然后通過 count 來獲取轉換后的分鍾時間間隔

 

time point:

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

 1 #include <iostream>
 2 #include <ratio>
 3 #include <chrono>
 4 using namespace std;
 5 
 6 int main(void) {
 7     using namespace std::chrono;
 8     typedef duration<int, std::ratio<60 * 60 * 24>> day_type;
 9 
10     time_point<system_clock, day_type> today = time_point_cast<day_type>(system_clock::now());
11     cout << today.time_since_epoch().count() << " days since epoch" << endl;
12 
13 // 輸出:
14 // 17598 days since epoch
15 
16     return 0;
17 }
View Code

 

time_point還支持一些算術元算,比如兩個time_point的差值時鍾周期數,還可以和duration相加減。下面的例子輸出前一天和后一天的日期:

 1 #include <iostream>
 2 #include <iomanip>
 3 #include <ctime>
 4 #include <chrono>
 5 using namespace std;
 6 
 7 int main(void) {
 8     using namespace std::chrono;
 9     system_clock::time_point now = system_clock::now();//獲得當前時間
10 
11     std::time_t last = system_clock::to_time_t(now - std::chrono::hours(24));
12     std::time_t next = system_clock::to_time_t(now + std::chrono::hours(24));
13 
14     return 0;
15 }
View Code

 

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 <iostream>
 2 #include <chrono>
 3 #include <ratio>
 4 using namespace std;
 5 
 6 int main(void) {
 7     using namespace std::chrono;
 8 
 9     time_point<system_clock> t1 = system_clock::now();
10     int cnt = 1e9;
11     while(--cnt);
12     time_point<system_clock> t2 = system_clock::now();
13 
14     cout << (t2 - t1).count() << endl;
15     //通過 duration_cast<>() 將周期轉化為 secondse
16     cout << std::chrono::duration_cast<seconds>( t2-t1 ).count() << endl;
17 
18 // 輸出:
19 // 2669897000
20 // 2
21 
22     return 0;
23 }
View Code

 

可以利用 high_resolution_clock 來實現一個類似於 boost.timer 的定時器

 1 #include <iostream>
 2 #include <chrono>
 3 #define ll long long
 4 using namespace std;
 5 using namespace std::chrono;
 6 
 7 class Timer{
 8 public:
 9     Timer() : m_begin(high_resolution_clock::now()) {}
10     //重置當前時間
11     void reset() {
12         m_begin = high_resolution_clock::now();
13     }
14 
15     //默認輸出毫秒
16     ll elapsed() const {
17         return duration_cast<chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
18     }
19 
20     //微秒
21     ll elapsed_micro() const {
22         return duration_cast<chrono::microseconds>(high_resolution_clock::now() - m_begin).count();
23     }
24 
25     //納秒
26     ll elapsed_nano() const {
27         return duration_cast<chrono::nanoseconds>(high_resolution_clock::now() - m_begin).count();
28     }
29 
30     //
31     ll elapsed_seconds() const {
32         return duration_cast<chrono::seconds>(high_resolution_clock::now() - m_begin).count();
33     }
34 
35     //
36     ll elapsed_minutes() const {
37         return duration_cast<chrono::minutes>(high_resolution_clock::now() - m_begin).count();
38     }
39 
40     //
41     ll elapsed_hours() const {
42         return duration_cast<chrono::hours>(high_resolution_clock::now() - m_begin).count();
43     }
44 
45 private:
46     time_point<high_resolution_clock> m_begin;
47 
48 };
49 
50 void fun(int n) {
51     while(--n);
52 }
53 
54 int main(void) {
55     Timer t;//開始記時
56     fun(1e9);
57     cout << t.elapsed_nano() << endl;
58     cout << t.elapsed_micro() << endl;
59     cout << t.elapsed() << endl;
60     cout << t.elapsed_seconds() << endl;
61     cout << t.elapsed_minutes() << endl;
62     cout << t.elapsed_hours() << endl;
63 
64 // 輸出:
65 // 2673899000
66 // 2673899
67 // 2674
68 // 2
69 // 0
70 // 0
71     
72     return 0;
73 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM