C++11提供了chrono庫,這個庫可以處理和時間相關的一些事情。這個庫里面主要有3個類:時間間隔Duration、時鍾Clocks和時間點Time point。
Duration
1 template<class Rep, class Period = std::ratio<1> > class duration;
概述
類模板 std::chrono::duration 表示時間間隔。
它由 Rep 類型的計次數和計次周期組成,其中計次周期是一個編譯期有理數常量,表示從一個計次到下一個的秒數。
存儲於 duration 的數據僅有 Rep 類型的計次數。若 Rep 是浮點數,則 duration 能表示小數的計次數。 Period 被包含為時長類型的一部分,且只在不同時長間轉換時使用。
類型說明
rep Rep 表示計次數的算術類型
1 template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;
period Period 表示每個時鍾周期的秒數,其中第一個模板參數Num代表分子,Denom代表分母,分母默認為1,ratio代表的是一個分子除以分母的分數值
對於一些特定的時間值已經有了定義:
1 std::chrono::nanoseconds duration</*至少 64 位的有符號整數類型*/,std::nano> 2 std::chrono::microseconds duration</*至少 55 位的有符號整數類型*/,std::micro> 3 std::chrono::milliseconds duration</*至少 45 位的有符號整數類型*/,std::milli> 4 std::chrono::seconds duration</*至少 35 位的有符號整數類型*/> 5 std::chrono::minutes duration</*至少 29 位的有符號整數類型*/,std::ratio<60>> 6 std::chrono::hours duration</*至少 23 位的有符號整數類型*/,std::ratio<3600>>
更直觀一些的定義如下:
1 typedef duration <Rep, ratio<3600,1>> hours; 2 typedef duration <Rep, ratio<60,1>> minutes; 3 typedef duration <Rep, ratio<1,1>> seconds; 4 typedef duration <Rep, ratio<1,1000>> milliseconds; 5 typedef duration <Rep, ratio<1,1000000>> microseconds; 6 typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
通過定義這些常用的時間間隔類型能方便在線程休眠這種場景下使用它們:
1 std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒 2 std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒
成員函數
1、count:返回此 duration 的計次數,即獲取時間間隔的時鍾周期個數。如果感到晦澀可以看下面的例子1。
2、operator+、operator-、前/后++、前/后--、operator+=、operator-=、operator*=、operator/=、operator%=:做一些加減乘除的元素。
3、duration_cast:轉換 std::chrono::duration 為不同類型 ToDuration 的時長。
例子1:
1 #include <iostream> 2 #include <chrono> 3 4 int main() 5 { 6 using shakes = std::chrono::duration<int, std::ratio<1, 100000000>>; 7 using jiffies = std::chrono::duration<int, std::centi>; 8 using microfortnights = std::chrono::duration<float, std::ratio<12096,10000>>; 9 using nanocenturies = std::chrono::duration<float, std::ratio<3155,1000>>; 10 11 std::chrono::seconds sec(1); 12 13 std::cout << "1 second is:\n"; 14 15 // 無精度損失的整數尺度轉換:無轉型 16 std::cout << std::chrono::microseconds(sec).count() << " microseconds\n" 17 << shakes(sec).count() << " shakes\n" 18 << jiffies(sec).count() << " jiffies\n"; 19 20 // 有精度損失的整數尺度轉換:需要轉型 21 std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count() 22 << " minutes\n"; 23 24 // 浮點尺度轉換:無轉型 25 std::cout << microfortnights(sec).count() << " microfortnights\n" 26 << nanocenturies(sec).count() << " nanocenturies\n"; 27 }
運行結果:
1 second is: 1000000 microseconds 100000000 shakes 100 jiffies 0 minutes 0.82672 microfortnights 0.316957 nanocenturies
最后的2個比較怪異的時間是這樣來的:
>>> 1000.0 / 3155 = 0.31695721077654515,就是說3155秒對應1000個microfortnights
>>> 10000.0 / 12096 = 0.8267195767195767,就是說12096秒對應10000個nanocenturies
例子2:
1 #include <iostream> 2 #include <chrono> 3 #include <ratio> 4 #include <thread> 5 6 using half_second = std::chrono::duration<float, std::ratio<1, 2> >; 7 8 int main() 9 { 10 std::chrono::seconds s{1}; 11 std::cout << "use second : " << s.count() << std::endl; 12 13 half_second ss{1}; 14 std::cout << "use half_second : " << ss.count() << std::endl; 15 std::cout << "use half_second : " << half_second(4).count() << std::endl; 16 std::cout << "use half_second : " << half_second(s).count() << std::endl; 17 18 std::chrono::minutes m{1}; 19 std::cout << "use half_second : " << half_second(m).count() << std::endl; 20 21 22 std::chrono::system_clock::time_point tt1 = std::chrono::system_clock::now(); 23 std::this_thread::sleep_for(std::chrono::seconds(1)); 24 std::chrono::system_clock::time_point tt2 = std::chrono::system_clock::now(); 25 std::cout << (tt2-tt1).count()<<" tick count" << "\t" << std::chrono::duration_cast<std::chrono::milliseconds>(tt2-tt1).count() <<std::endl; 26 27 std::chrono::system_clock::time_point tt3 = std::chrono::system_clock::now(); 28 std::this_thread::sleep_for(half_second(1)); 29 std::chrono::system_clock::time_point tt4 = std::chrono::system_clock::now(); 30 std::cout << (tt4-tt3).count()<<" tick count" << "\t" << std::chrono::duration_cast<std::chrono::milliseconds>(tt4-tt3).count() <<std::endl; 31 32 std::chrono::minutes t1( 10 ); 33 std::chrono::seconds t2( 60 ); 34 std::chrono::seconds t3 = t1 - t2; 35 std::cout << t3.count() << " second" << std::endl; 36 37 std::cout << std::chrono::duration_cast<std::chrono::minutes>( t3 ).count() << " minutes" << std::endl; 38 39 return 0; 40 }
運行結果:
use second : 1 use half_second : 1 use half_second : 4 use half_second : 2 use half_second : 120 1000063777 tick count 1000 500060683 tick count 500 540 second 9 minutes
關於自己定義的half_second計時,傳入的是數字的話,count就是實際數字,只有傳入了其他時間單位的話才能體現出half_second的“半秒”的作用。
還有就是注意sleep_for里面的half_second也是生效了。
本文參考自:
http://www.cnblogs.com/qicosmos/p/3642712.html
http://zh.cppreference.com/w/cpp/chrono
