C++11計時器:chrono庫介紹


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/110/11/11/101/1000

這些比率加上距離量綱就變成距離分辨率,加上時間量綱就變成時間分辨率了。為此,C++11定義了一個新的模板類ratio,用於表示比率,定義如下:

 

std::ratio<intmax_t N, intmax_t>表示時鍾周期,是用秒表示的時間單位,

ratio是一個分數類型的值,其中N表示分子(秒),D表示分母(周期)

常用的時間單位已經定義好了

 

ratio<3600, 1>                hours             (3600秒為一個周期,表示一小時)
ratio<60, 1>                    minutes
ratio<1, 1>                      seconds
ratio<1, 1000>                 millisecond
ratio<1, 1000000>          microseconds
ratio<1, 1000000000>    nanosecons

 

 
注意,我們自己可以定義Period,比如ratio<1, -2> r,  一個 r 表示單位時間是-0.5秒。

 

 
        

 二、持續的時間 -  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

 

 

 

 

 
        
 


免責聲明!

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



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