C++11有了chrono庫,可以在不同系統中很容易的實現定時功能。
要使用chrono庫,需要#include<chrono>,其所有實現均在std::chrono namespace下。注意標准庫里面的每個命名空間代表了一個獨立的概念。
chrono是一個模版庫,使用簡單,功能強大,只需要理解三個概念:duration、time_point、clock
一 、時鍾-CLOCK
chrono庫定義了三種不同的時鍾:
std::chrono::system_clock: 依據系統的當前時間 (不穩定) std::chrono::steady_clock: 以統一的速率運行(不能被調整) std::chrono::high_resolution_clock: 提供最高精度的計時周期(可能是steady_clock或者system_clock的typedef)
這三個時鍾有什么區別呢?
system_clock就類似Windows系統右下角那個時鍾,是系統時間。明顯那個時鍾是可以亂設置的。明明是早上10點,卻可以設置成下午3點。
steady_clock則針對system_clock可以隨意設置這個缺陷而提出來的,他表示時鍾是不能設置的。
high_resolution_clock則是一個高分辨率時鍾。
這三個時鍾類都提供了一個靜態成員函數now()用於獲取當前時間,該函數的返回值是一個time_point類型,
system_clock除了now()函數外,還提供了to_time_t()靜態成員函數。用於將系統時間轉換成熟悉的std::time_t類型,
得到了time_t類型的值,在使用ctime()函數將時間轉換成字符串格式,就可以很方便地打印當前時間了。
#include<iostream> #include<vector> #include<string> #include<ctime>//將時間格式的數據轉換成字符串 #include<chrono> using namespace std::chrono; using namespace std; int main() { //獲取系統的當前時間 auto t = system_clock::now(); //將獲取的時間轉換成time_t類型 auto tNow = system_clock::to_time_t(t); //ctime()函數將time_t類型的時間轉化成字符串格式,這個字符串自帶換行符 string str_time = std::ctime(&tNow); cout<<str_time; return 0; }
時間精度其實也就是時間分辨率。拋開時間量綱單論分辨率,其實就是一個比率。如:1000/1、10/1、1/1 、1/10、1/1000。
這些比率加上距離量綱就變成距離分辨率,加上時間量綱就變成時間分辨率了。為此,C++11定義了一個新的模板類ratio,用於表示比率,定義如下:
std::ratio<intmax_t N, intmax_t D >表示時鍾周期,是用秒表示的時間單位,
ratio是一個分數類型的值,其中N表示分子(秒),D表示分母(周期)
常用的時間單位已經定義好了
二、持續的時間 - duration
std::chrono::duration<int,ratio<60,1>> ,表示持續的一段時間,這段時間的單位是由ratio<60,1>決定的,int表示這段時間的值的類型,函數返回的類型還是一個時間段duration
std::chrono::duration<double,ratio<60,1>>
由於各種時間段(duration)表示不同,chrono庫提供了duration_cast類型轉換函數。
duration_cast用於將duration進行轉換成另一個類型的duration。
duration還有一個成員函數count(),用來表示這一段時間的長度
#include<iostream> #include<string.h> #include<chrono> using namespace std::chrono; using namespace std; int main() { auto start = steady_clock::now(); for(int i=0;i<100;i++) cout<<"nice"<<endl; auto end = steady_clock::now(); auto tt = duration_cast<microseconds>(end - start); cout<<"程序用時="<<tt.count()<<"微秒"<<endl; return 0; }
三、時間點 - time_point
std::chrono::time_point 表示一個具體時間,如上個世紀80年代、你的生日、今天下午、火車出發時間等,只要它能用計算機時鍾表示。鑒於我們使用時間的情景不同,這個time point具體到什么程度,由選用的單位決定。一個time point必須有一個clock計時
設置一個時間點:
time_point<clock類型> 時間點名字
//設置一個高精度時間點 time_point<high_resolution_clock> high_resolution_clock::now();
參考博客:https://blog.csdn.net/luotuo44/article/details/46854229