最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年11月28日 15:55:19   作者:帝江VII  
chrono是c++ 11中的時(shí)間庫(kù),本文就來詳細(xì)的介紹一下chrono庫(kù)的具體使用,關(guān)鍵是理解里面時(shí)間段(Durations)、時(shí)間點(diǎn)(Time points)的概念,感興趣的可以了解一下

chrono是c++ 11中的時(shí)間庫(kù),提供計(jì)時(shí),時(shí)鐘等功能。

學(xué)習(xí)chrono,關(guān)鍵是理解里面時(shí)間段(Durations)、時(shí)間點(diǎn)(Time points)的概念。

1.精度:

時(shí)鐘節(jié)拍(時(shí)間精度):

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

其中N表示分子,D表示分母,默認(rèn)用秒表示的時(shí)間單位。

N對(duì)應(yīng)于其成員num,D對(duì)應(yīng)于其成員den

常用的單位:

ratio<60, 1>? ??? ??? ??? ??? ??minute

ratio<1, 1>? ??? ??? ??? ??? ????second

ratio<1, 1000>? ??? ??? ??? ?millisecond

...

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

#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;
}

2.時(shí)間段:

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

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

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

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

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

(1)構(gòu)造函數(shù)很簡(jiǎn)單

(1)duration() = default;    //默認(rèn)構(gòu)造
(2)duration (const duration& dtn);        //(2)(3)拷貝構(gòu)造
(3)template<class Rep2, class Period2>
   constexpr duration (const duration<Rep2,Period2>& dtn);
(4)template<class Rep2>      //傳遞一個(gè)某類型(int等)的數(shù)值,構(gòu)造一個(gè)時(shí)間段   
   constexpr explicit duration (const Rep2& n);

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

#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;
}

(2)當(dāng)不要求截?cái)嘀档那闆r下(時(shí)轉(zhuǎn)換成秒是沒問題,但是秒轉(zhuǎn)換成時(shí)就不行)時(shí)間段的轉(zhuǎn)換是隱式
的。顯示轉(zhuǎn)換可以由 std::chrono::duration_cast<> 來完成。
比如 std::chrono::milliseconds ms(54802);

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

這里的結(jié)果就是截?cái)嗟?,而不是進(jìn)行了舍入,所以s最后的值將為54。

3.時(shí)間點(diǎn):

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

std::chrono::time_point 表示一個(gè)具體時(shí)間,如上個(gè)世紀(jì)80年代、今天下午3點(diǎn)、火車出發(fā)時(shí)間等,只要它能用計(jì)算機(jī)時(shí)鐘表示。

第一個(gè)模板參數(shù)Clock用來指定所要使用的時(shí)鐘(標(biāo)準(zhǔn)庫(kù)中有三種時(shí)鐘,system_clock,steady_clock和high_resolution_clock。見4時(shí)鐘詳解),第二個(gè)模板函數(shù)參數(shù)用來表示時(shí)間的計(jì)量單位(特化的std::chrono::duration<> )

時(shí)間點(diǎn)都有一個(gè)時(shí)間戳,即時(shí)間原點(diǎn)。chrono庫(kù)中采用的是Unix的時(shí)間戳1970年1月1日 00:00。所以time_point也就是距離時(shí)間戳(epoch)的時(shí)間長(zhǎng)度(duration)。

(1)構(gòu)造函數(shù):

(1)
 time_point();           //默認(rèn)構(gòu)造函數(shù),時(shí)間戳作為其值
            
(2)
template <class Duration2>
time_point (const time_point<clock,Duration2>& tp);  //拷貝構(gòu)造函數(shù)
(3)
explicit time_point (const duration& dtn);           //使用duration構(gòu)造,就是距離時(shí)間戳的時(shí)間長(zhǎng)度

(2)時(shí)間點(diǎn)有個(gè)重要的函數(shù):duration time_since_epoch() ?(用于獲取當(dāng)前時(shí)間點(diǎn)距離時(shí)間戳的時(shí)間長(zhǎng)度)

即經(jīng)常用來得到當(dāng)前時(shí)間點(diǎn)到1970年1月1日00:00的時(shí)間距離、該函數(shù)返回的duration的精度和構(gòu)造time_point的時(shí)鐘(Clock)有關(guān)(見4時(shí)鐘詳解)。

#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
int main()
{
	//距離時(shí)間戳2兩秒
	chrono::time_point<chrono::system_clock, chrono::seconds> tp(chrono::seconds(2));
	cout << "to epoch : " <<tp.time_since_epoch().count() << "s" <<endl;
	//轉(zhuǎn)化為ctime,打印輸出時(shí)間點(diǎn)
	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;
}

可以看出,時(shí)間戳就是使用的Unix的時(shí)間戳。

4.時(shí)鐘:(代表當(dāng)前系統(tǒng)的時(shí)間)

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

system_clock是不穩(wěn)定的。因?yàn)闀r(shí)鐘是可調(diào)的,即這種是完全自動(dòng)適應(yīng)本地賬戶的調(diào)節(jié)。這種調(diào)節(jié)可能造成的是,首次調(diào)用now()返回的時(shí)間要早于上次調(diào)用now()所返回的時(shí)間,這就違反了節(jié)拍頻率的均勻分布。穩(wěn)定鬧鐘對(duì)于超時(shí)的計(jì)算很重要,所以C++標(biāo)準(zhǔn)庫(kù)提供一個(gè)穩(wěn)定時(shí)鐘 std::chrono::steady_clock。std::chrono::high_resolution_clock 是標(biāo)準(zhǔn)庫(kù)中提供的具有最小節(jié)拍周期(因此具有最高的精度的時(shí)鐘)。

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

#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;
}

windows系統(tǒng)的測(cè)試結(jié)果是system_clock的精度是100納秒,而high_resolution的精度是1納秒,對(duì)于程序來說,一般毫秒級(jí)就夠了,所以說chrono提供的時(shí)鐘精度綽綽有余。

(1)成員函數(shù)static time_point now() noexcept; 用于獲取系統(tǒng)的當(dāng)前時(shí)間。

(2)由于各種time_point表示方式不同,chrono也提供了相應(yīng)的轉(zhuǎn)換函數(shù) time_point_cast。

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

傳一個(gè)要轉(zhuǎn)換為的精度的duration模板參數(shù)和一個(gè)要轉(zhuǎn)換的time_point參數(shù)(用法見下面綜合應(yīng)用)

(3)其他成員函數(shù):

to_time_t() time_point轉(zhuǎn)換成time_t秒

from_time_t() 從time_t轉(zhuǎn)換成time_point

綜合應(yīng)用:

輸出當(dāng)前時(shí)間,并且計(jì)算當(dāng)前的時(shí)間距離1970年1月1日00:00的毫秒數(shù)

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

通過兩張圖片對(duì)比,時(shí)間點(diǎn)上相差48-34=14秒、、下面的一長(zhǎng)串?dāng)?shù)字,切掉3位(毫秒)、是28-14=14秒、、正確!說明這一串?dāng)?shù)字的最后三位就是毫秒數(shù)、、充分說明了達(dá)到了毫秒級(jí)別。

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

到此這篇關(guān)于c++11 chrono全面解析(最高可達(dá)納秒級(jí)別的精度)的文章就介紹到這了,更多相關(guān)c++11 chrono內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • unsigned中無符號(hào)是什么詳析

    unsigned中無符號(hào)是什么詳析

    unsigned為“無符號(hào)”的意思,unsigned,zerofill既為非負(fù)數(shù),用此類型可以增加數(shù)據(jù)長(zhǎng)度,下面這篇文章主要給大家介紹了關(guān)于unsigned中無符號(hào)是什么的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • c++遍歷lua table示例

    c++遍歷lua table示例

    這篇文章主要介紹了c++遍歷lua table示例,需要的朋友可以參考下
    2014-04-04
  • 詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法

    詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法

    這篇文章主要介紹了詳解C++編程中向函數(shù)傳遞引用參數(shù)的用法,包括使函數(shù)返回引用類型以及對(duì)指針的引用,需要的朋友可以參考下
    2016-01-01
  • FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    ffplay是FFmpeg提供的一個(gè)極為簡(jiǎn)單的音視頻媒體播放器,可以用于音視頻播放、可視化分析。本文將利用ffplay實(shí)現(xiàn)自定義輸入流播放,需要的可以參考一下
    2022-12-12
  • C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼

    C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼

    這篇文章主要介紹了C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-11-11
  • C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    右值引用和move語義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Seesion在C++服務(wù)端的使用方法

    Seesion在C++服務(wù)端的使用方法

    這篇文章主要介紹了Seesion在C++服務(wù)端是怎么使用的?本文給出了解決方案和實(shí)例代碼供大家參考,需要的朋友可以參考下
    2020-02-02
  • C語言實(shí)現(xiàn)階乘的示例詳解

    C語言實(shí)現(xiàn)階乘的示例詳解

    在現(xiàn)實(shí)中,我們做數(shù)學(xué)題總會(huì)遇到階乘問題,這在計(jì)算機(jī)中也不例外。 那我們應(yīng)該怎么實(shí)現(xiàn)呢?下面小編就為大家講解一下C語言中階乘的實(shí)現(xiàn)
    2022-07-07
  • opencv攝像頭捕獲識(shí)別顏色

    opencv攝像頭捕獲識(shí)別顏色

    這篇文章主要介紹了opencv攝像頭捕獲識(shí)別顏色,用opencv通過攝像頭捕獲識(shí)別顏色,紅色藍(lán)色等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • opencv求解區(qū)域的內(nèi)接矩形

    opencv求解區(qū)域的內(nèi)接矩形

    這篇文章主要為大家詳細(xì)介紹了opencv求解區(qū)域的內(nèi)接矩形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論

柳州市| 潜山县| 镇坪县| 漳浦县| 英吉沙县| 梅州市| 迁西县| 喀喇| 江安县| 白银市| 两当县| 甘肃省| 开化县| 鸡东县| 丰原市| 荆门市| 太仆寺旗| 黄大仙区| 黄冈市| 孟村| 河源市| 微博| 沛县| 丰都县| 香河县| 威海市| 遂昌县| 大足县| 隆德县| 高密市| 龙州县| 岳普湖县| 宜兴市| 镇平县| 鲁山县| 织金县| 哈巴河县| 阿勒泰市| 积石山| 桑日县| 澎湖县|