C/C++時(shí)間庫(kù)chrono的使用總結(jié)
在程序設(shè)計(jì)中,時(shí)間管理是一個(gè)核心概念,它不僅關(guān)系到程序的效率和性能,而且直接影響用戶(hù)體驗(yàn)。C++作為一門(mén)高效的編程語(yǔ)言,提供了std::chrono
庫(kù),用于精確地處理和計(jì)算時(shí)間。這個(gè)庫(kù)的設(shè)計(jì)體現(xiàn)了程序員對(duì)時(shí)間流逝的敏感性,同時(shí)也揭示了編程中對(duì)精確度和性能的持續(xù)追求。
使用 <chrono>
庫(kù)的好處是可以以不同的精度測(cè)量時(shí)間,包括納秒、微秒、毫秒和秒。通過(guò)計(jì)算兩個(gè)時(shí)間點(diǎn)之間的時(shí)間間隔,可以精確地測(cè)量代碼執(zhí)行的時(shí)間。
std::chrono庫(kù)主要包含以下功能:
- 時(shí)間點(diǎn):表示特定的時(shí)間點(diǎn),比如當(dāng)前的時(shí)間。這如同人們通過(guò)記憶可以回憶起特定的時(shí)刻。
- 時(shí)間段:表示時(shí)間的長(zhǎng)度,比如1秒,1分鐘,1小時(shí)等。這如同人們能夠感知時(shí)間的流逝,理解"早","晚"等概念。
- 時(shí)鐘:用于獲取當(dāng)前的時(shí)間點(diǎn),有三種類(lèi)型的時(shí)鐘:system_clock,steady_clock和high_resolution_clock。這如同人們通過(guò)看表來(lái)知道現(xiàn)在的具體時(shí)間。
為了更好的理解這些功能,讓我們看一下下面的表格:
類(lèi)名 | 描述 | 對(duì)應(yīng)的心理學(xué)概念 |
---|---|---|
std::chrono::system_clock | 系統(tǒng)的實(shí)際時(shí)間,可能會(huì)受到系統(tǒng)時(shí)間調(diào)整的影響 | 外部環(huán)境對(duì)人的影響 |
std::chrono::steady_clock | 穩(wěn)定的時(shí)鐘,時(shí)間從不調(diào)整 | 穩(wěn)定、可靠的心理狀態(tài) |
std::chrono::high_resolution_clock | 提供最小的可表示的時(shí)間間隔 | 細(xì)微的心理變化 |
std::chrono::time_point | 表示特定的時(shí)間點(diǎn) | 特定的記憶 |
std::chrono::duration | 表示時(shí)間的長(zhǎng)度 | 時(shí)間的感知 |
通過(guò)一個(gè)具體實(shí)例來(lái)逐步講解時(shí)間庫(kù)chrono的使用,實(shí)例如下:
// 開(kāi)始計(jì)時(shí) auto startTime = std::chrono::steady_clock::now(); //自己定義的檢查答案的函數(shù),可忽略 checkAnswers(problems); // 停止計(jì)時(shí) auto endTime = std::chrono::steady_clock::now(); // 計(jì)算答題時(shí)間 std::chrono::duration<double> elapsedSeconds = endTime - startTime; int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60); int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60; std::cout << "Time taken: " << elapsedMinutes << " minutes " << elapsedSecondsRemainder << " seconds" << std::endl;
逐條語(yǔ)句講解:
開(kāi)始或者停止計(jì)時(shí)的代碼
// 開(kāi)始計(jì)時(shí) auto startTime = std::chrono::steady_clock::now(); // 停止計(jì)時(shí) auto endTime = std::chrono::steady_clock::now();
這段代碼使用了C++標(biāo)準(zhǔn)庫(kù)中的 <chrono>
頭文件中的時(shí)間庫(kù),用于獲取開(kāi)始計(jì)時(shí)時(shí)間并將其存儲(chǔ)在變量 startTime
中,獲取停止計(jì)時(shí)時(shí)間并將其存儲(chǔ)在變量 endTime
中。
下面是對(duì)該代碼的解釋?zhuān)?/p>
std::chrono::steady_clock
:steady_clock
是一個(gè)表示穩(wěn)定、遞增的時(shí)鐘,用于測(cè)量時(shí)間間隔。它提供了一個(gè)相對(duì)穩(wěn)定的時(shí)間基準(zhǔn),適用于測(cè)量較小時(shí)間間隔。std::chrono::steady_clock::now()
:now()
是steady_clock
類(lèi)的成員函數(shù),用于獲取當(dāng)前的時(shí)間點(diǎn)。auto startTime = std::chrono::steady_clock::now();
:這行代碼使用auto
關(guān)鍵字自動(dòng)推導(dǎo)變量類(lèi)型,將當(dāng)前時(shí)間點(diǎn)的值賦給變量startTime
。由于std::chrono::steady_clock::now()
返回的是一個(gè)時(shí)間點(diǎn)對(duì)象,編譯器通過(guò)自動(dòng)類(lèi)型推導(dǎo)將其分配給startTime
變量。
計(jì)算答題時(shí)間的代碼
// 計(jì)算答題時(shí)間 std::chrono::duration<double> elapsedSeconds = endTime - startTime; int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60); int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
這段代碼用于計(jì)算答題時(shí)間,并將其分解為分鐘和秒。
1.std::chrono::duration<double> elapsedSeconds = endTime - startTime;
:
這一行代碼計(jì)算 endTime
和 startTime
之間的時(shí)間差,并將結(jié)果存儲(chǔ)在 elapsedSeconds
變量中。elapsedSeconds
是一個(gè) std::chrono::duration
類(lèi)型的對(duì)象,用于表示持續(xù)的時(shí)間。通過(guò)將 endTime
減去 startTime
,我們得到了這段時(shí)間的持續(xù)時(shí)間。
注:std::chrono::duration
是 C++ 標(biāo)準(zhǔn)庫(kù)中用于表示時(shí)間持續(xù)的類(lèi)模板。std::chrono::duration
提供了一系列成員函數(shù)和運(yùn)算符,用于對(duì)時(shí)間持續(xù)進(jìn)行操作和計(jì)算。一些常用的成員函數(shù)和運(yùn)算符包括:
count()
:返回持續(xù)時(shí)間的內(nèi)部表示值(類(lèi)型為 Rep)。operator+、operator-
:用于對(duì)兩個(gè)持續(xù)時(shí)間進(jìn)行加法和減法運(yùn)算。operator*、operator/
:用于將持續(xù)時(shí)間乘以或除以一個(gè)標(biāo)量值。operator==、operator!=、operator<、operator>
:用于比較兩個(gè)持續(xù)時(shí)間的大小關(guān)系。
2.int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
:
這一行代碼將持續(xù)時(shí)間轉(zhuǎn)換為以分鐘為單位的整數(shù)值。elapsedSeconds.count()
返回持續(xù)時(shí)間的秒數(shù),除以 60 可以得到分鐘數(shù)。使用 static_cast<int>
進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,將浮點(diǎn)數(shù)結(jié)果轉(zhuǎn)換為整數(shù)。
注:static_cast
是 C++ 中的一種類(lèi)型轉(zhuǎn)換操作符,用于進(jìn)行靜態(tài)類(lèi)型轉(zhuǎn)換(static_cast)。
靜態(tài)類(lèi)型轉(zhuǎn)換是一種在編譯時(shí)進(jìn)行的類(lèi)型轉(zhuǎn)換,它允許將一個(gè)類(lèi)型轉(zhuǎn)換為另一個(gè)相關(guān)類(lèi)型,前提是這兩個(gè)類(lèi)型之間存在某種類(lèi)型轉(zhuǎn)換的關(guān)系。
static_cast 可以用于以下幾種轉(zhuǎn)換:
- 隱式類(lèi)型轉(zhuǎn)換:static_cast 可以將一種算術(shù)類(lèi)型轉(zhuǎn)換為另一種算術(shù)類(lèi)型,如將 int 轉(zhuǎn)換為 double、將 float 轉(zhuǎn)換為 int 等。
- 類(lèi)層次轉(zhuǎn)換:static_cast 可以在類(lèi)層次結(jié)構(gòu)中進(jìn)行向上轉(zhuǎn)型(upcast)和向下轉(zhuǎn)型(downcast),但在向下轉(zhuǎn)型時(shí)需要注意安全性,因?yàn)?static_cast 不提供運(yùn)行時(shí)類(lèi)型檢查。如果向下轉(zhuǎn)型是不安全的,應(yīng)該使用 dynamic_cast 進(jìn)行動(dòng)態(tài)類(lèi)型轉(zhuǎn)換。
- 指針類(lèi)型轉(zhuǎn)換:static_cast 可以在指針類(lèi)型之間進(jìn)行轉(zhuǎn)換,包括將派生類(lèi)指針轉(zhuǎn)換為基類(lèi)指針(向上轉(zhuǎn)型)和將基類(lèi)指針轉(zhuǎn)換為派生類(lèi)指針(向下轉(zhuǎn)型)。在指針轉(zhuǎn)換時(shí),編譯器不會(huì)進(jìn)行運(yùn)行時(shí)類(lèi)型檢查,因此需要確保轉(zhuǎn)換是安全的。
引用類(lèi)型轉(zhuǎn)換:static_cast 可以在引用類(lèi)型之間進(jìn)行轉(zhuǎn)換,類(lèi)似于指針類(lèi)型轉(zhuǎn)換。轉(zhuǎn)換時(shí)需要注意類(lèi)型的兼容性和安全性。
3.int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
:
這一行代碼計(jì)算以秒為單位的剩余時(shí)間。elapsedSeconds.count()
返回持續(xù)時(shí)間的秒數(shù),使用 static_cast<int>
將其轉(zhuǎn)換為整數(shù)。然后,通過(guò)取模運(yùn)算符 %
將其對(duì) 60 取余,得到不足一分鐘的剩余秒數(shù)。
到此這篇關(guān)于C/C++時(shí)間庫(kù)chrono的使用總結(jié)的文章就介紹到這了,更多相關(guān)C++時(shí)間庫(kù)chrono內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++日期與時(shí)間 chrono庫(kù)介紹及使用教程
- 深入理解C++中std::chrono庫(kù)的使用
- 關(guān)于C++使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳問(wèn)題
- c++11 chrono全面解析(最高可達(dá)納秒級(jí)別的精度)
- C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考)
- C++中Boost.Chrono時(shí)間庫(kù)的使用方法
- C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例
- C++實(shí)現(xiàn)統(tǒng)計(jì)代碼運(yùn)行時(shí)間計(jì)時(shí)器的簡(jiǎn)單實(shí)例
- C++11計(jì)時(shí)器之chrono庫(kù)簡(jiǎn)介
相關(guān)文章
C++求所有頂點(diǎn)之間的最短路徑(用Floyd算法)
這篇文章主要為大家詳細(xì)介紹了C++求所有頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C++中測(cè)試程序運(yùn)行時(shí)間的幾種方法總結(jié)
本文介紹了C++中測(cè)量程序運(yùn)行時(shí)間的幾種方法,包括使用GetTickCount()、clock()、Boost庫(kù)的timer類(lèi)以及高精度時(shí)控函數(shù)QueryPerformanceFrequency和QueryPerformanceCounter,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2022-11-11C++開(kāi)發(fā)在IOS環(huán)境下運(yùn)行的LRUCache緩存功能
本文著重介紹如何在XCODE中,通過(guò)C++開(kāi)發(fā)在IOS環(huán)境下運(yùn)行的緩存功能。算法基于LRU,最近最少使用,需要的朋友可以參考下2012-11-11C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07