一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c++11 chrono全面解析(最高可達納秒級別的精度)

c++11 chrono全面解析(最高可達納秒級別的精度)

2022-03-07 14:17帝江VII C/C++

chrono是c++ 11中的時間庫,本文就來詳細的介紹一下chrono庫的具體使用,關鍵是理解里面時間段(Durations)、時間點(Time points)的概念,感興趣的可以了解一下

chrono是c++ 11中的時間庫,提供計時,時鐘等功能。

學習chrono,關鍵是理解里面時間段(Durations)、時間點(Time points)的概念。

1.精度:

時鐘節拍(時間精度):

template <intmax_t N, intmax_t D = 1> class ratio;

其中N表示分子,D表示分母,默認用秒表示的時間單位。

N對應于其成員num,D對應于其成員den

常用的單位:

ratio<60, 1>                    minute

ratio<1, 1>                      second

ratio<1, 1000>               millisecond

...

ratio主要是是為后面將要講解的時間段,時間點等提供精度(單位)

#include<iostream>
#include<chrono>
using namespace std;
int main()
{
	cout << "millisecond : ";
	cout << std::chrono::milliseconds::period::num << "/" << std::chrono::milliseconds::period::den << "s" <<endl;
	system("pause");
	return 0;
}

c++11 chrono全面解析(最高可達納秒級別的精度)

 

2.時間段:

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

std::chrono::duration 表示一段時間,比如兩個小時,12.88秒,半個時辰,一炷香的時間等等

Rep表示一種數值類型,用來表示Period的數量,比如int float double。

Period是ratio類型,用來表示上面所說的單位精度,比如second milisecond。

chrono中宏定義了許多特例化了的duration: 就是常見的hours,miniutes,seconds,milliseconds等,使用std::chrono::milliseconds直接使用。

(1)構造函數很簡單

(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);

(2)成員函數count()返回單位時間的數量。

#include <iostream>
#include <chrono>
int main()
{
	std::chrono::milliseconds mscond(1000); // 1 second
	std::cout << mscond.count() << " milliseconds.\n";

	std::cout << mscond.count() * std::chrono::milliseconds::period::num / std::chrono::milliseconds::period::den;
	std::cout << " seconds.\n";
	system("pause");
	return 0;
}

c++11 chrono全面解析(最高可達納秒級別的精度)

(2)當不要求截斷值的情況下(時轉換成秒是沒問題,但是秒轉換成時就不行)時間段的轉換是隱式
的。顯示轉換可以由 std::chrono::duration_cast<> 來完成。
比如 std::chrono::milliseconds ms(54802);

std::chrono::seconds s=std::chrono::duration_cast<std::chrono::seconds>(ms);

這里的結果就是截斷的,而不是進行了舍入,所以s最后的值將為54。

 

3.時間點:

template <class Clock, class Duration = typename Clock::duration>
class time_point;

std::chrono::time_point 表示一個具體時間,如上個世紀80年代、今天下午3點、火車出發時間等,只要它能用計算機時鐘表示。

第一個模板參數Clock用來指定所要使用的時鐘(標準庫中有三種時鐘,system_clock,steady_clock和high_resolution_clock。見4時鐘詳解),第二個模板函數參數用來表示時間的計量單位(特化的std::chrono::duration<> )

時間點都有一個時間戳,即時間原點。chrono庫中采用的是Unix的時間戳1970年1月1日 00:00。所以time_point也就是距離時間戳(epoch)的時間長度(duration)。

(1)構造函數:

 

(1)
time_point();           //默認構造函數,時間戳作為其值
          
(2)
template <class Duration2>
time_point (const time_point<clock,Duration2>& tp);  //拷貝構造函數
(3)
explicit time_point (const duration& dtn);           //使用duration構造,就是距離時間戳的時間長度

(2)時間點有個重要的函數:duration time_since_epoch()  (用于獲取當前時間點距離時間戳的時間長度)

即經常用來得到當前時間點到1970年1月1日00:00的時間距離、該函數返回的duration的精度和構造time_point的時鐘(Clock)有關(見4時鐘詳解)。

#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
int main()
{
	//距離時間戳2兩秒
	chrono::time_point<chrono::system_clock, chrono::seconds> tp(chrono::seconds(2));
	cout << "to epoch : " <<tp.time_since_epoch().count() << "s" <<endl;
	//轉化為ctime,打印輸出時間點
	time_t tt = chrono::system_clock::to_time_t(tp);
	char a[50];
	ctime_s(a, sizeof(a), &tt);
	cout << a;
	system("pause");
	return 0;
}

c++11 chrono全面解析(最高可達納秒級別的精度)

可以看出,時間戳就是使用的Unix的時間戳。

 

4.時鐘:(代表當前系統的時間)

chrono中有三種時鐘:system_clock,steady_clock和high_resolution_clock。每一個clock類中都有確定的time_point, duration, Rep, Period類型。

system_clock是不穩定的。因為時鐘是可調的,即這種是完全自動適應本地賬戶的調節。這種調節可能造成的是,首次調用now()返回的時間要早于上次調用now()所返回的時間,這就違反了節拍頻率的均勻分布。穩定鬧鐘對于超時的計算很重要,所以C++標準庫提供一個穩定時鐘 std::chrono::steady_clock。std::chrono::high_resolution_clock 是標準庫中提供的具有最小節拍周期(因此具有最高的精度的時鐘)。

上文所說time_since_epoch(),以及將要介紹的now()函數的返回值都依賴于時鐘的精度,測試時鐘的精度的一種方法就是:

#include <iostream>
#include <chrono>
using namespace std;
int main()
{
	cout << "system clock          : ";
	cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;
	cout << "steady clock          : ";
	cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;
	cout << "high resolution clock : ";
	cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;
	system("pause");
	return 0;
}

c++11 chrono全面解析(最高可達納秒級別的精度)

windows系統的測試結果是system_clock的精度是100納秒,而high_resolution的精度是1納秒,對于程序來說,一般毫秒級就夠了,所以說chrono提供的時鐘精度綽綽有余。

(1)成員函數static time_point now() noexcept; 用于獲取系統的當前時間。

(2)由于各種time_point表示方式不同,chrono也提供了相應的轉換函數 time_point_cast。

template <class ToDuration, class Clock, class Duration>
time_point<Clock,ToDuration> time_point_cast (const time_point<Clock,Duration>& tp);

傳一個要轉換為的精度的duration模板參數和一個要轉換的time_point參數(用法見下面綜合應用)

(3)其他成員函數:

to_time_t() time_point轉換成time_t秒

from_time_t() 從time_t轉換成time_point

綜合應用:

輸出當前時間,并且計算當前的時間距離1970年1月1日00:00的毫秒數

#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
int main()
{
	//定義毫秒級別的時鐘類型
	typedef chrono::time_point<chrono::system_clock, chrono::milliseconds> microClock_type;
	//獲取當前時間點,windows system_clock是100納秒級別的(不同系統不一樣,自己按照介紹的方法測試),所以要轉換
	microClock_type tp = chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
	//轉換為ctime.用于打印顯示時間
	time_t tt = chrono::system_clock::to_time_t(tp);
	char _time[50];
	ctime_s(_time,sizeof(_time),&tt);
	cout << "now time is : " << _time;
	//計算距離1970-1-1,00:00的時間長度,因為當前時間點定義的精度為毫秒,所以輸出的是毫秒
	cout << "to 1970-1-1,00:00  " << tp.time_since_epoch().count() << "ms" << endl;
	system("pause");
	return 0;
}

c++11 chrono全面解析(最高可達納秒級別的精度)

c++11 chrono全面解析(最高可達納秒級別的精度)

通過兩張圖片對比,時間點上相差48-34=14秒、、下面的一長串數字,切掉3位(毫秒)、是28-14=14秒、、正確!說明這一串數字的最后三位就是毫秒數、、充分說明了達到了毫秒級別。

將上面的程序中millisconds換成microseconds或者更小的單位,便可達到微妙,甚至更高的精度。

到此這篇關于c++11 chrono全面解析(最高可達納秒級別的精度)的文章就介紹到這了,更多相關c++11 chrono內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_31175231/article/details/77923212

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 亚洲、国产综合视频 | 欧美1级 | 成人精品区 | 91夜夜人人揉人人捏人人添 | 国产成人精品高清免费 | 暖暖影院日本版 | 婷婷精品进入 | 毛片视频网站 | 九九99九九精彩网站 | 波多野结衣教师未删减版 | a∨在线观看 | 国内精品免费 | 波多野结衣久久国产精品 | 国产免费福利片 | 亚洲天堂视频在线免费观看 | 香蕉久久网| 三年片韩国在线观看 | 四虎国产成人亚洲精品 | 国产3344视频在线观看免费 | 2019年国产不卡在线刷新 | naruto堂同人本子汉化gg | 久久99亚洲热最新地址获取 | 国产麻豆视频 | 动漫美女被吸乳 | 好大水好多好爽好硬好深视频 | 好湿好紧太硬了我太爽了网站 | 欧美日韩中文字幕久久伊人 | 欧美日韩专区国产精品 | brazzersxxx欧美| 99久久精品免费看国产 | 99久久国产综合精品网成人影院 | 亚洲欧美专区精品久久 | a级影视| 99精品免费在线观看 | 91制片在线观看 | nxgx欧美| porno中国xxxxx | 九九精品视频在线观看 | 91免费播放人人爽人人快乐 | 欧美性白人顶级hd | 2021国产麻豆剧传媒剧情最新 |