C++中std::chrono時(shí)間庫(kù)的全面解析
一、引言
C++ std::chrono時(shí)間庫(kù)是C++標(biāo)準(zhǔn)庫(kù)提供的一個(gè)時(shí)間處理庫(kù),提供了一個(gè)方便、靈活和精確的時(shí)間處理工具,用于在程序中進(jìn)行時(shí)間相關(guān)的操作和計(jì)算。它具有以下重要性和作用:
精確的時(shí)間計(jì)量:std::chrono時(shí)間庫(kù)提供了高精度的時(shí)間計(jì)量單位和操作,可以精確測(cè)量和計(jì)算代碼的執(zhí)行時(shí)間、延時(shí)等。
跨平臺(tái)兼容性:std::chrono時(shí)間庫(kù)在不同平臺(tái)上都具備良好的兼容性,無(wú)論是Windows、Linux還是其他操作系統(tǒng),都可以使用該庫(kù)進(jìn)行時(shí)間處理,使代碼具備良好的可移植性。
高度可擴(kuò)展性:該庫(kù)提供了豐富的時(shí)間單位和精度選項(xiàng),適應(yīng)不同場(chǎng)景下的時(shí)間計(jì)算需求。無(wú)論是秒、毫秒、微秒還是納秒的時(shí)間單位,都可以很方便地應(yīng)用于代碼中。
時(shí)鐘的靈活選擇:std::chrono時(shí)間庫(kù)提供了不同類型的時(shí)鐘,如系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高分辨率時(shí)鐘(high_resolution_clock),可以根據(jù)具體需求選擇合適的時(shí)鐘類型。
時(shí)間點(diǎn)和時(shí)間段的處理:該庫(kù)提供了表示時(shí)間點(diǎn)(time_point)和時(shí)間段(duration)的相關(guān)類,可以對(duì)時(shí)間進(jìn)行精確刻度和處理。時(shí)間點(diǎn)表示具體的時(shí)間,時(shí)間段表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。
C++ std::chrono時(shí)間庫(kù)能夠幫助準(zhǔn)確測(cè)量和控制代碼的執(zhí)行時(shí)間,處理定時(shí)任務(wù),進(jìn)行時(shí)間間隔計(jì)算等操作。這里將全面介紹C++ std::chrono時(shí)間庫(kù)的使用,幫助讀者理解其核心概念和各種功能,從而在編程中更好地掌握時(shí)間的節(jié)奏,解放代碼從時(shí)間束縛中。
目標(biāo):
- 首先對(duì)C++ std::chrono時(shí)間庫(kù)進(jìn)行全面而清晰的概述,解釋其在編程中的重要性和作用。
- 詳細(xì)講解C++ std::chrono時(shí)間庫(kù)的組成部分,包括duration、time_point和clock。了解它們是如何相互配合工作的,以及如何使用它們來(lái)進(jìn)行時(shí)間相關(guān)的操作。
- 供詳細(xì)的使用攻略,涵蓋duration(時(shí)間段)的使用方法、單位和精度的選擇、示例代碼等;time_point(時(shí)間點(diǎn))的創(chuàng)建、比較和操作方法,以及相關(guān)的應(yīng)用場(chǎng)景;不同類型的時(shí)鐘(clock)的特點(diǎn)、適用場(chǎng)景和使用方法等。
- 除了基本的使用方法,還將探討一些高級(jí)技巧和實(shí)踐,如時(shí)區(qū)處理、時(shí)間格式轉(zhuǎn)換等。我們還將解決一些常見的時(shí)間相關(guān)問(wèn)題,提供實(shí)用的技巧和最佳實(shí)踐,更高效、準(zhǔn)確地使用時(shí)間庫(kù),解放代碼從時(shí)間束縛中。
二、C++ std::chrono時(shí)間庫(kù)概述
2.1、std::chrono命名空間的作用和用途
C++ std::chrono命名空間是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)命名空間,它包含了一組用于處理時(shí)間和時(shí)間相關(guān)操作的類和函數(shù)。該命名空間提供了豐富的時(shí)間處理功能,旨在方便進(jìn)行時(shí)間計(jì)算、測(cè)量和控制。
std::chrono命名空間的主要作用和用途:
1.提供時(shí)間單位和精度的定義:std::chrono命名空間定義了一系列時(shí)間單位,如秒(seconds)、毫秒(milliseconds)、微秒(microseconds)和納秒(nanoseconds),以及精度等級(jí),如高精度時(shí)鐘(high_resolution_clock)和穩(wěn)定時(shí)鐘(steady_clock)。這些定義使得時(shí)間計(jì)算和測(cè)量更加靈活和精確。
2.定義時(shí)間段和時(shí)間點(diǎn)的概念:std::chrono命名空間提供了表示時(shí)間段(duration)和時(shí)間點(diǎn)(time_point)的相關(guān)類,包括std::chrono::duration和std::chrono::time_point。時(shí)間段表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差,時(shí)間點(diǎn)表示具體的時(shí)間。
3.支持時(shí)間的計(jì)算和操作:該命名空間提供了各種用于時(shí)間計(jì)算和操作的函數(shù)和操作符。例如,可以通過(guò)相加或相減兩個(gè)時(shí)間點(diǎn)或時(shí)間段來(lái)計(jì)算時(shí)間的差異、延遲或間隔。也可以比較兩個(gè)時(shí)間點(diǎn)的先后順序,判斷時(shí)間的先后關(guān)系。
4.管理和控制時(shí)間流逝:std::chrono命名空間提供了函數(shù)和工具,可用于管理和控制時(shí)間的流逝。例如,可以獲取當(dāng)前的系統(tǒng)時(shí)間和時(shí)鐘時(shí)間,或者獲取程序執(zhí)行的實(shí)際時(shí)間。還可以設(shè)置定時(shí)任務(wù)或者延時(shí)執(zhí)行代碼。
5.std::chrono命名空間是C++標(biāo)準(zhǔn)庫(kù)的一部分,因此它具有跨平臺(tái)的兼容性,并且在不同的操作系統(tǒng)中都能正常工作。
2.2、基本組成部分:duration、time_point和clock
時(shí)間庫(kù)的基本組成部分包括duration(時(shí)間段)、time_point(時(shí)間點(diǎn))和clock(時(shí)鐘)。它們相互配合,用于表示和處理時(shí)間的不同方面。
duration(時(shí)間段):
duration是時(shí)間庫(kù)中表示時(shí)間段的類。它表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。時(shí)間段可以用秒(seconds)、毫秒(milliseconds)、微秒(microseconds)等不同的單位來(lái)表示。duration類的模板參數(shù)包括時(shí)間單位和所需的精度。比如:std::chrono::duration<int, std::ratio<1, 1000>>表示毫秒級(jí)別的時(shí)間段。在使用Duration時(shí),可以進(jìn)行加減、比較和表示等操作。
time_point(時(shí)間點(diǎn)):
time_point表示一個(gè)特定的時(shí)間點(diǎn),可以理解為時(shí)間的戳記。時(shí)間點(diǎn)和時(shí)間段之間可以進(jìn)行加減運(yùn)算,用于計(jì)算時(shí)間的差異或延遲。time_point類的模板參數(shù)包括所采用的時(shí)鐘類型和時(shí)間單位。比如:std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>表示系統(tǒng)時(shí)鐘下的納秒級(jí)時(shí)間點(diǎn)??梢垣@取當(dāng)前的時(shí)間點(diǎn)、比較不同時(shí)間點(diǎn)的順序,以及對(duì)時(shí)間點(diǎn)進(jìn)行格式化等操作。
clock(時(shí)鐘):
clock是時(shí)間庫(kù)中的時(shí)鐘類,用于提供時(shí)間的基準(zhǔn)和計(jì)量。不同的時(shí)鐘類型提供不同的時(shí)間精度和功能。常用的時(shí)鐘類型有系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高精度時(shí)鐘(high_resolution_clock)。系統(tǒng)時(shí)鐘提供了與操作系統(tǒng)相關(guān)的時(shí)間,穩(wěn)定時(shí)鐘提供了穩(wěn)定的、不受系統(tǒng)時(shí)間變化影響的時(shí)間,而高精度時(shí)鐘提供了更高的時(shí)間精度。時(shí)鐘類可以獲取當(dāng)前時(shí)間,計(jì)算時(shí)間的間隔和延遲等。
這三個(gè)基本組成部分相互配合,使時(shí)間庫(kù)具有了強(qiáng)大的時(shí)間處理能力。Duration表示時(shí)間段,Time_point表示時(shí)間點(diǎn),而Clock則提供了時(shí)鐘的基準(zhǔn)。通過(guò)使用它們,可以對(duì)時(shí)間進(jìn)行準(zhǔn)確的計(jì)算、比較和操作,從而靈活地處理時(shí)間相關(guān)的任務(wù)和邏輯。
三、duration的使用詳解
3.1、duration表示時(shí)間段的概念和使用方法
Duration(時(shí)間段)是時(shí)間庫(kù)中表示時(shí)間間隔的類,用于表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。
1.表示和定義duration:
duration類是一個(gè)模板類,模板參數(shù)包括時(shí)間單位和精度。時(shí)間單位可以是秒(seconds)、毫秒(milliseconds)、微秒(microseconds)或納秒(nanoseconds),精度可以是整數(shù)類型(int、long)、浮點(diǎn)類型(float、double)等。例如,可以定義一個(gè)表示毫秒級(jí)別的時(shí)間段:std::chrono::duration<int, std::milli>。
2.創(chuàng)建duration對(duì)象:
可以通過(guò)直接給Duration對(duì)象賦值來(lái)創(chuàng)建它。對(duì)Duration對(duì)象的賦值可以使用整數(shù)、浮點(diǎn)數(shù)、其他duration對(duì)象,以及乘法、除法、加法和減法等操作。例如:
std::chrono::duration<int, std::milli> duration1(500); // 創(chuàng)建一個(gè)表示500毫秒的duration對(duì)象 std::chrono::duration<double, std::ratio<1, 1000>> duration2 = 2.5; // 創(chuàng)建一個(gè)表示2.5毫秒的duration對(duì)象 std::chrono::duration<float, std::ratio<1>> duration3 = duration1 + duration2; // 創(chuàng)建一個(gè)表示3秒的duration對(duì)象
3.訪問(wèn)duration的值:
可以使用成員函數(shù)count()來(lái)訪問(wèn)Duration對(duì)象的值。count()函數(shù)返回Duration對(duì)象表示的時(shí)間段值,以它所定義的時(shí)間單位返回。例如:
std::chrono::duration<int, std::milli> duration(500); int milliseconds = duration.count(); // 返回500
4.操作duration:
可以使用各種數(shù)學(xué)運(yùn)算符對(duì)duration對(duì)象進(jìn)行加法、減法、乘法和除法等操作。這些操作在邏輯上保持了時(shí)間單位的一致性。例如:
std::chrono::duration<int, std::milli> duration1(500); std::chrono::duration<double, std::nano> duration2(1.5); std::chrono::duration<int, std::micro> duration3 = duration1 + duration2; // 表示501.5微秒 std::chrono::duration<int, std::milli> duration4 = duration1 * 2; // 表示1000毫秒 std::chrono::duration<double, std::milli> duration5 = duration2 / 2; // 表示0.75毫秒
5.比較duration:
可以使用比較運(yùn)算符(<、<=、>、>=、==、!=)來(lái)比較duration對(duì)象之間的大小關(guān)系。比較操作是基于Duration對(duì)象所表示的時(shí)間單位進(jìn)行的。例如:
std::chrono::duration<int, std::milli> duration1(500); std::chrono::duration<double, std::nano> duration2(1.5); bool result = duration1 > duration2; // 返回true,因?yàn)?00毫秒大于1.5納秒
3.2、duration的各種單位和精度選項(xiàng)
時(shí)間單位(Time Units)。時(shí)間單位表示Duration所表示時(shí)間間隔的度量單位。時(shí)間單位包括:
- 納秒(nanoseconds):std::chrono::nanoseconds
- 微秒(microseconds):std::chrono::microseconds
- 毫秒(milliseconds):std::chrono::milliseconds
- 秒(seconds):std::chrono::seconds
- 分鐘(minutes):std::chrono::minutes
- 小時(shí)(hours):std::chrono::hours
這些單位可以提供不同精度的時(shí)間間隔表示。
精度(Precision):
精度表示duration所使用的數(shù)值類型,可以是整型(整數(shù)類型)或浮點(diǎn)型(浮點(diǎn)數(shù)類型)??梢允褂脴?biāo)準(zhǔn)數(shù)值類型(如int、long、float、double)作為Duration的數(shù)值類型,并與所選的時(shí)間單位進(jìn)行配對(duì)。
例如,可以選擇使用以下精度選項(xiàng):
- 整數(shù)類型精度:std::chrono::duration<int, TimeUnit>
- 長(zhǎng)整數(shù)類型精度:std::chrono::duration<long, TimeUnit>
- 浮點(diǎn)類型精度:std::chrono::duration<float, TimeUnit>
- 雙精度類型精度:std::chrono::duration<double, TimeUnit>
例如,如果需要表示毫秒級(jí)別的時(shí)間間隔,可以選擇std::chrono::duration<int, std::milli>,它使用整數(shù)類型表示毫秒。
下面是一些示例,展示了如何使用不同的時(shí)間單位和精度選項(xiàng):
using namespace std::chrono; // 表示10毫秒的duration,使用整數(shù)類型精度 duration<int, std::milli> duration1(10); // 表示5秒的duration,使用長(zhǎng)整數(shù)類型精度 duration<long, std::seconds> duration2(5); // 表示2.5秒的duration,使用浮點(diǎn)類型精度 duration<float, std::seconds> duration3(2.5); // 表示1分鐘的duration,使用雙精度類型精度 duration<double, std::minutes> duration4(1); // 可以使用auto關(guān)鍵字自動(dòng)推導(dǎo)出duration的類型 auto duration5 = duration<int, std::micro>(100);
3.3、使用示例
以下是一些使用Duration的具體示例,涵蓋時(shí)間計(jì)算和延時(shí)操作:
時(shí)間計(jì)算示例:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 創(chuàng)建兩個(gè)時(shí)間點(diǎn)
steady_clock::time_point start = steady_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬耗時(shí)操作
steady_clock::time_point end = steady_clock::now();
// 計(jì)算時(shí)間間隔
duration<double> duration = duration_cast<duration<double>>(end - start);
// 輸出時(shí)間間隔
std::cout << "Elapsed time: " << duration.count() << " seconds\n";
return 0;
}
上述示例中,使用steady_clock來(lái)獲取當(dāng)前時(shí)間點(diǎn),并通過(guò)duration_cast將時(shí)間間隔轉(zhuǎn)換為秒。最后,使用count()函數(shù)獲取時(shí)間間隔的值并進(jìn)行輸出。
延時(shí)操作示例:
#include <iostream>
#include <chrono>
#include <thread>
int main() {
using namespace std::chrono;
std::cout << "Start" << std::endl;
// 進(jìn)行延時(shí)操作,暫停程序執(zhí)行
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "End" << std::endl;
return 0;
}
使用this_thread::sleep_for函數(shù)來(lái)進(jìn)行延時(shí)操作,程序會(huì)暫停執(zhí)行2秒鐘,然后繼續(xù)往下執(zhí)行。
四、time_point的使用詳解
4.1、time_point表示具體時(shí)間點(diǎn)的概念和使用方法
time_point(時(shí)間點(diǎn))是std::chrono庫(kù)中用于表示具體時(shí)間的類型。它表示了某個(gè)具體時(shí)刻的時(shí)間點(diǎn),可以用于比較不同時(shí)間點(diǎn)的時(shí)間先后或時(shí)間間隔的計(jì)算。
time_point由兩部分組成:時(shí)鐘(Clock)和表示時(shí)間的持續(xù)時(shí)間(Duration)。
1.時(shí)鐘(Clock):
時(shí)鐘是std::chrono庫(kù)中的一種類型,用于測(cè)量時(shí)間的流逝。std::chrono庫(kù)提供了幾種不同的時(shí)鐘類型,包括steady_clock(穩(wěn)定時(shí)鐘)、system_clock(系統(tǒng)時(shí)鐘)和high_resolution_clock(高分辨率時(shí)鐘)等。不同的時(shí)鐘類型提供了不同的時(shí)間精度和適用范圍。
2.表示時(shí)間的持續(xù)時(shí)間(Duration):
Duration表示時(shí)間的長(zhǎng)度或時(shí)間間隔,可以是納秒、微秒、毫秒、秒、分鐘、小時(shí)等不同的時(shí)間單位。Duration類的模板參數(shù)指定了時(shí)間長(zhǎng)度的數(shù)值類型和時(shí)間單位。
使用方法:
要?jiǎng)?chuàng)建一個(gè)time_point對(duì)象,需要指定時(shí)鐘類型和持續(xù)時(shí)間。可以使用當(dāng)前的時(shí)鐘來(lái)獲取當(dāng)前時(shí)間點(diǎn),也可以根據(jù)需求指定一個(gè)特定的時(shí)間點(diǎn)。示例:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 使用系統(tǒng)時(shí)鐘獲取當(dāng)前時(shí)間點(diǎn)
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
// 創(chuàng)建一個(gè)表示特定時(shí)間點(diǎn)的time_point
std::chrono::system_clock::time_point specific_time =
std::chrono::system_clock::time_point(std::chrono::seconds(1625100000));
// 比較兩個(gè)時(shí)間點(diǎn)的先后
if (now > specific_time) {
std::cout << "The current time is later than the specific time.\n";
} else {
std::cout << "The current time is earlier than the specific time.\n";
}
// 計(jì)算時(shí)間間隔
std::chrono::duration<double> duration = now - specific_time;
std::cout << "The duration between the two time points is: " << duration.count() << " seconds.\n";
return 0;
}
通過(guò)std::chrono庫(kù)中的system_clock獲取了當(dāng)前時(shí)間點(diǎn),并通過(guò)手動(dòng)指定一個(gè)特定的時(shí)間點(diǎn)。然后,可以比較這兩個(gè)時(shí)間點(diǎn)的先后,并計(jì)算它們之間的時(shí)間間隔。
4.2、time_point與duration之間的關(guān)系
time_point表示一個(gè)具體的時(shí)間點(diǎn),可以視為時(shí)間的參考點(diǎn)或標(biāo)記。它由兩個(gè)組成部分構(gòu)成:時(shí)鐘(Clock)和持續(xù)時(shí)間(Duration)。時(shí)鐘指定了時(shí)間的基準(zhǔn)和精度,而持續(xù)時(shí)間表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間間隔。
duration表示一個(gè)時(shí)間長(zhǎng)度或時(shí)間間隔,它可以是納秒、微秒、毫秒、秒、分鐘、小時(shí)等不同的時(shí)間單位。
duration模板類的參數(shù)指定了時(shí)間長(zhǎng)度的數(shù)值類型和時(shí)間單位。持續(xù)時(shí)間的正負(fù)值決定了時(shí)間間隔是向前還是向后。
time_point和duration之間的關(guān)系:
- 通過(guò)time_point和duration的組合,可以表示一個(gè)時(shí)間點(diǎn),也可以計(jì)算兩個(gè)時(shí)間點(diǎn)之間的時(shí)間間隔。
- 可以在time_point上添加或減去某個(gè)duration,以獲得新的time_point。例如,可以將一個(gè)time_point向前推進(jìn)一個(gè)duration,或者將一個(gè)duration加上一個(gè)time_point來(lái)計(jì)算未來(lái)的時(shí)間點(diǎn)。
- 可以通過(guò)計(jì)算兩個(gè)time_point之間的時(shí)間間隔,得到一個(gè)duration對(duì)象。這是通過(guò)減去一個(gè)time_point(較早的時(shí)間點(diǎn))從另一個(gè)time_point(較晚的時(shí)間點(diǎn))來(lái)實(shí)現(xiàn)的。
下面是一個(gè)使用time_point和duration的示例,展示了它們之間的關(guān)系:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 獲取當(dāng)前時(shí)間點(diǎn)
system_clock::time_point start = system_clock::now();
// 進(jìn)行一些耗時(shí)操作
std::this_thread::sleep_for(std::chrono::seconds(2));
// 獲取后續(xù)的時(shí)間點(diǎn)
system_clock::time_point end = system_clock::now();
// 計(jì)算時(shí)間間隔
duration<double> duration = duration_cast<duration<double>>(end - start);
// 輸出時(shí)間間隔
std::cout << "Elapsed time: " << duration.count() << " seconds\n";
return 0;
}
說(shuō)明:使用system_clock獲取了開始和結(jié)束的時(shí)間點(diǎn),然后通過(guò)減法操作計(jì)算時(shí)間間隔duration。最后,使用duration的count()方法獲取時(shí)間間隔的值,并輸出結(jié)果。這個(gè)示例演示了如何結(jié)合使用time_point和duration來(lái)計(jì)算時(shí)間間隔。
4.3、如何創(chuàng)建、比較和操作time_point對(duì)象
演示了如何創(chuàng)建、比較和操作time_point對(duì)象:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 創(chuàng)建一個(gè)time_point對(duì)象 - 使用系統(tǒng)時(shí)鐘獲取當(dāng)前時(shí)間點(diǎn)
system_clock::time_point now = system_clock::now();
// 創(chuàng)建一個(gè)time_point對(duì)象 - 手動(dòng)指定一個(gè)特定時(shí)間點(diǎn)
system_clock::time_point specific_time = system_clock::time_point(seconds(1625100000));
// 比較兩個(gè)time_point對(duì)象的先后
if (now > specific_time) {
std::cout << "The current time is later than the specific time.\n";
} else {
std::cout << "The current time is earlier than the specific time.\n";
}
// 操作time_point對(duì)象,計(jì)算時(shí)間間隔
system_clock::time_point future = now + hours(48);
duration<double> duration = duration_cast<duration<double>>(future - now);
std::cout << "The duration between now and future is: " << duration.count() << " seconds.\n";
return 0;
}
說(shuō)明:使用system_clock獲取了當(dāng)前時(shí)間點(diǎn),并通過(guò)手動(dòng)指定一個(gè)特定的時(shí)間點(diǎn)創(chuàng)建了另一個(gè)time_point對(duì)象。然后,比較這兩個(gè)time_point對(duì)象的先后關(guān)系,并輸出結(jié)果。接下來(lái),操作time_point對(duì)象,通過(guò)將一個(gè)duration(48小時(shí))加到當(dāng)前時(shí)間點(diǎn)上,得到一個(gè)未來(lái)的時(shí)間點(diǎn)。最后,我們計(jì)算了當(dāng)前時(shí)間點(diǎn)和未來(lái)時(shí)間點(diǎn)之間的時(shí)間間隔,并輸出結(jié)果。
注意:在計(jì)算時(shí)間間隔時(shí),使用了duration_cast將時(shí)間間隔轉(zhuǎn)換為所需的duration類型(在這里是double類型)。
五、clock的使用詳解
5.1、不同類型的clock
在std::chrono庫(kù)中,存在三種不同類型的時(shí)鐘:system_clock、steady_clock和high_resolution_clock。它們都用于表示時(shí)間點(diǎn)和測(cè)量時(shí)間間隔,但在實(shí)際應(yīng)用中會(huì)有一些區(qū)別。
1.system_clock:
- system_clock是系統(tǒng)級(jí)別的時(shí)鐘,它表示實(shí)時(shí)時(shí)鐘,也就是指示當(dāng)前時(shí)間的時(shí)鐘。它的時(shí)間點(diǎn)是與系統(tǒng)的時(shí)鐘相關(guān)聯(lián)的,可能受到時(shí)鐘調(diào)整和時(shí)區(qū)的影響。
- system_clock用于獲取當(dāng)前的系統(tǒng)時(shí)間,可以用來(lái)進(jìn)行日常時(shí)間計(jì)算和顯示。它通常被用作默認(rèn)的時(shí)鐘類型。
- system_clock的最小時(shí)間單位取決于系統(tǒng),可能是秒、毫秒或微秒。
2.steady_clock:
- steady_clock是一個(gè)單調(diào)遞增的時(shí)鐘,不受任何時(shí)鐘調(diào)整或時(shí)區(qū)的影響。它提供了一個(gè)穩(wěn)定、可靠的時(shí)間基準(zhǔn),適合用于測(cè)量時(shí)間間隔和計(jì)算算法的執(zhí)行時(shí)間。
- steady_clock的最小時(shí)間單位取決于實(shí)現(xiàn),通常是納秒或微秒級(jí)別。
3.high_resolution_clock:
- high_resolution_clock是一個(gè)可用于測(cè)量小時(shí)間間隔的時(shí)鐘。它通常使用最高分辨率的時(shí)鐘源來(lái)提供更高的時(shí)間精度。在大部分平臺(tái)上,high_resolution_clock是steady_clock的別名,因此也是一個(gè)單調(diào)遞增的時(shí)鐘。
- high_resolution_clock的最小時(shí)間單位取決于實(shí)現(xiàn),通常是納秒或微秒級(jí)別。
使用不同類型的時(shí)鐘的示例:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 使用system_clock獲取當(dāng)前時(shí)間
system_clock::time_point system_now = system_clock::now();
// 使用steady_clock獲取開始時(shí)間
steady_clock::time_point steady_start = steady_clock::now();
// 一些操作...
// 使用steady_clock獲取結(jié)束時(shí)間
steady_clock::time_point steady_end = steady_clock::now();
// 使用high_resolution_clock獲取開始時(shí)間
high_resolution_clock::time_point high_res_start = high_resolution_clock::now();
// 一些操作...
// 使用high_resolution_clock獲取結(jié)束時(shí)間
high_resolution_clock::time_point high_res_end = high_resolution_clock::now();
// 輸出時(shí)間間隔
duration<double> steady_duration = duration_cast<duration<double>>(steady_end - steady_start);
duration<double> high_res_duration = duration_cast<duration<double>>(high_res_end - high_res_start);
std::cout << "Steady duration: " << steady_duration.count() << " seconds.\n";
std::cout << "High resolution duration: " << high_res_duration.count() << " seconds.\n";
return 0;
}
說(shuō)明:使用system_clock獲取了當(dāng)前時(shí)間,使用steady_clock和high_resolution_clock獲取了開始和結(jié)束時(shí)間。然后,通過(guò)減法操作計(jì)算了時(shí)間間隔,并使用duration_cast將時(shí)間間隔轉(zhuǎn)換為double類型的秒數(shù)。最后,輸出了steady_clock和high_resolution_clock的時(shí)間間隔。
5.2、每種clock的特點(diǎn)和適用場(chǎng)景
不同類型的時(shí)鐘(system_clock、steady_clock和high_resolution_clock)具有不同的特點(diǎn)和適用場(chǎng)景
1.system_clock:
特點(diǎn):system_clock是一個(gè)系統(tǒng)級(jí)別的時(shí)鐘,用于表示實(shí)時(shí)時(shí)鐘,它的時(shí)間點(diǎn)是與系統(tǒng)相關(guān)聯(lián)的。它可以受到時(shí)鐘調(diào)整和時(shí)區(qū)的影響。
適用場(chǎng)景:system_clock適用于獲取當(dāng)前的系統(tǒng)時(shí)間、進(jìn)行日常時(shí)間計(jì)算和顯示。它通常被用作默認(rèn)的時(shí)鐘類型。
2.steady_clock:
特點(diǎn):steady_clock是一個(gè)單調(diào)遞增的時(shí)鐘,不受任何時(shí)鐘調(diào)整或時(shí)區(qū)的影響,提供了一個(gè)穩(wěn)定、可靠的時(shí)間基準(zhǔn)。
適用場(chǎng)景:steady_clock適用于測(cè)量時(shí)間間隔、計(jì)算算法的執(zhí)行時(shí)間等希望得到穩(wěn)定和可靠時(shí)間測(cè)量的場(chǎng)景。由于不受時(shí)鐘調(diào)整的影響,它特別適合用于計(jì)算程序的運(yùn)行時(shí)間、測(cè)量短時(shí)間間隔等要求精確性的計(jì)時(shí)操作。
3.high_resolution_clock:
特點(diǎn):high_resolution_clock是一個(gè)可用于測(cè)量小時(shí)間間隔的時(shí)鐘,通常使用最高分辨率的時(shí)鐘源來(lái)提供更高的時(shí)間精度。在大部分平臺(tái)上,high_resolution_clock是steady_clock的別名,因此也是一個(gè)單調(diào)遞增的時(shí)鐘。
適用場(chǎng)景:high_resolution_clock可以用于需要更高時(shí)間精度的場(chǎng)景,比如測(cè)量微小的時(shí)間間隔、對(duì)性能進(jìn)行優(yōu)化的任務(wù),或者需要盡可能精確的時(shí)間測(cè)量。
注意:不同的平臺(tái)可能對(duì)這些時(shí)鐘的實(shí)現(xiàn)有所不同,最小時(shí)間單位也可能有所不同??梢允褂胐uration_cast將時(shí)間間隔轉(zhuǎn)換為所需的時(shí)間單位(例如秒、毫秒、納秒等)。
如果需要表示當(dāng)前實(shí)時(shí)時(shí)間、進(jìn)行日常時(shí)間計(jì)算和顯示,可以使用system_clock。而如果需要測(cè)量時(shí)間間隔、計(jì)算算法的執(zhí)行時(shí)間等,可以使用steady_clock。如果需要更高的時(shí)間精度,可以使用high_resolution_clock。
六、應(yīng)用示例
定時(shí)任務(wù)??梢允褂胹td::this_thread::sleep_for函數(shù)來(lái)創(chuàng)建定時(shí)任務(wù)。每隔一秒打印一次消息的示例:
#include <iostream>
#include <chrono>
#include <thread>
int main() {
while (true) {
std::cout << "Hello, World!" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
測(cè)量代碼執(zhí)行時(shí)間:使用std::chrono::steady_clock可以測(cè)量代碼塊的執(zhí)行時(shí)間。測(cè)量排序算法的執(zhí)行時(shí)間:
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
auto start = std::chrono::steady_clock::now();
std::sort(nums.begin(), nums.end());
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Sorting took " << diff.count() << " seconds." << std::endl;
return 0;
}
使代碼跨平臺(tái)。使用std::chrono可以實(shí)現(xiàn)跨平臺(tái)的時(shí)間處理,避免依賴于特定平臺(tái)的系統(tǒng)調(diào)用。獲取當(dāng)前時(shí)間點(diǎn)并打印出來(lái):
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::ctime(&time) << std::endl;
return 0;
}
時(shí)間格式化:std::chrono庫(kù)提供了一些用于格式化時(shí)間的函數(shù)和類。可以使用std::put_time函數(shù)將時(shí)間對(duì)象格式化為字符串,并指定所需的時(shí)間格式。它接受一個(gè)時(shí)間對(duì)象和格式化字符串作為參數(shù),返回一個(gè)格式化后的字符串。示例代碼如下:
#include <iostream>
#include <chrono>
#include <iomanip>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::put_time(std::localtime(&t), "%c") << std::endl;
return 0;
}
說(shuō)明:將當(dāng)前時(shí)間格式化為日期和時(shí)間的字符串,并以本地時(shí)間格式(“%c”)進(jìn)行輸出。
總結(jié)
C++的std::chrono時(shí)間庫(kù)提供了處理時(shí)間相關(guān)操作的功能。
核心概念:
時(shí)鐘(Clock):表示時(shí)間的源頭,提供了時(shí)間的基準(zhǔn)和刻度。常見的時(shí)鐘有系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高精度時(shí)鐘(high_resolution_clock)。
時(shí)間點(diǎn)(Time Point):表示特定時(shí)鐘上的一個(gè)時(shí)間。時(shí)間點(diǎn)可使用時(shí)鐘的成員函數(shù)now()獲取,也可以通過(guò)時(shí)鐘的to_time_point()函數(shù)從時(shí)間表示轉(zhuǎn)換得到。
時(shí)間間隔(Duration):表示一段時(shí)間的表示,可以是秒、毫秒、微秒、納秒等等。時(shí)間間隔的類型為duration,比如duration<int, std::ratio<1, 1000>>表示毫秒。
使用方法:
獲取當(dāng)前時(shí)間點(diǎn):使用時(shí)鐘的now()成員函數(shù)可以獲取當(dāng)前時(shí)間點(diǎn),返回一個(gè)時(shí)間點(diǎn)對(duì)象。
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
計(jì)算時(shí)間間隔:使用時(shí)間點(diǎn)對(duì)象相減可以計(jì)算時(shí)間間隔,返回一個(gè)時(shí)間間隔對(duì)象。
std::chrono::duration<double> diff = end - start; double seconds = diff.count();
休眠指定時(shí)間:使用std::this_thread::sleep_for()函數(shù)可以使當(dāng)前線程休眠指定的時(shí)間間隔。
std::this_thread::sleep_for(std::chrono::seconds(1));
轉(zhuǎn)換時(shí)間表示:可以通過(guò)時(shí)鐘的成員函數(shù)to_time_t()將時(shí)間點(diǎn)對(duì)象轉(zhuǎn)換為time_t表示,或使用ctime()函數(shù)將time_t轉(zhuǎn)換為字符串表示。
std::time_t time = std::chrono::system_clock::to_time_t(now); std::cout << "Current time: " << std::ctime(&time) << std::endl;
以上就是C++中std::chrono時(shí)間庫(kù)的全面解析的詳細(xì)內(nèi)容,更多關(guān)于C++ std::chrono時(shí)間庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C++中std::find函數(shù)介紹和使用場(chǎng)景
- C++中std::count函數(shù)介紹和使用場(chǎng)景
- C++ std::any的模擬實(shí)現(xiàn)
- C++中std::is_object的具體使用
- 深入理解C++中std::chrono庫(kù)的使用
- C++17中std::byte的具體使用詳解
- C++ std::make_unique和std::make_shared用法小結(jié)
- C++筆記之std::future的用法小結(jié)
- C++ std::unique_lock 用法實(shí)例詳解
- C++的std::transform()的實(shí)現(xiàn)
- C++中std::sort函數(shù)介紹和使用場(chǎng)景
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼
24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過(guò)加減乘除以及括號(hào)運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下2022-08-08
C語(yǔ)言陷阱與缺陷之?dāng)?shù)組越界訪問(wèn)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的數(shù)組越界訪問(wèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02

