C++ Boost Chrono實(shí)現(xiàn)計(jì)時(shí)碼表流程詳解
一、Boost.Chrono說(shuō)明
庫(kù) Boost.Chrono 提供了多種時(shí)鐘。例如,您可以獲取當(dāng)前時(shí)間,也可以測(cè)量流程中經(jīng)過(guò)的時(shí)間。
Boost.Chrono 的部分內(nèi)容已添加到 C++11。如果您的開(kāi)發(fā)環(huán)境支持 C++11,您可以訪問(wèn)頭文件 chrono.xml 中定義的多個(gè)時(shí)鐘。但是,C++11 不支持某些功能,例如用于測(cè)量 CPU 時(shí)間的時(shí)鐘。此外,只有 Boost.Chrono 支持用戶(hù)定義的時(shí)間輸出格式。
二、示例代碼
您可以通過(guò)頭文件 boost/chrono.hpp 訪問(wèn)所有 Boost.Chrono 時(shí)鐘。唯一的擴(kuò)展是用戶(hù)定義的格式,它需要頭文件 boost/chrono_io.hpp。
例 37.1。來(lái)自 Boost.Chrono 的所有時(shí)鐘
#include <boost/chrono.hpp> #include <iostream> using namespace boost::chrono; int main() { std::cout << system_clock::now() << '\n'; #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY std::cout << steady_clock::now() << '\n'; #endif std::cout << high_resolution_clock::now() << '\n'; #ifdef BOOST_CHRONO_HAS_PROCESS_CLOCKS std::cout << process_real_cpu_clock::now() << '\n'; std::cout << process_user_cpu_clock::now() << '\n'; std::cout << process_system_cpu_clock::now() << '\n'; std::cout << process_cpu_clock::now() << '\n'; #endif #ifdef BOOST_CHRONO_HAS_THREAD_CLOCK std::cout << thread_clock::now() << '\n'; #endif }
例 37.1 介紹了 Boost.Chrono 提供的所有時(shí)鐘。所有時(shí)鐘都有一個(gè)共同的成員函數(shù) now(),它返回一個(gè)時(shí)間點(diǎn)。所有時(shí)間點(diǎn)都相對(duì)于普遍有效的時(shí)間點(diǎn)。這個(gè)參考時(shí)間點(diǎn)稱(chēng)為紀(jì) 元。一個(gè)經(jīng)常使用的紀(jì) 元是 1970 年 1 月 1 日。示例 37.1 為顯示的每個(gè)時(shí)間點(diǎn)寫(xiě)入紀(jì) 元。
Boost.Chrono 包括以下時(shí)鐘:
boost::chrono::system_clock 返回系統(tǒng)時(shí)間。這是通常顯示在計(jì)算機(jī)桌面上的時(shí)間。如果您更改計(jì)算機(jī)上的時(shí)間,boost::chrono::system_clock 會(huì)返回新時(shí)間。示例 37.1 將字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:自 1970 年 1 月 1 日以來(lái)的 13919594042183544 [1/10000000] 秒。
對(duì)于 boost::chrono::system_clock,epoch 沒(méi)有標(biāo)準(zhǔn)化。這些示例中使用的紀(jì) 元 1970 年 1 月 1 日取決于實(shí)現(xiàn)。但是,如果您特別想獲取自 1970 年 1 月 1 日以來(lái)的時(shí)間,請(qǐng)調(diào)用 to_time_t()。 to_time_t() 是一個(gè)靜態(tài)成員函數(shù),它以 std::time_t 形式返回自 1970 年 1 月 1 日以來(lái)的當(dāng)前系統(tǒng)時(shí)間秒數(shù)。
boost::chrono::steady_clock 是一個(gè)時(shí)鐘,它總是在稍后訪問(wèn)時(shí)返回。即使在計(jì)算機(jī)上設(shè)置了時(shí)間, boost::chrono::steady_clock 也會(huì)返回稍后的時(shí)間。這個(gè)時(shí)間被稱(chēng)為單調(diào)時(shí)間。
示例 37.1 顯示自系統(tǒng)啟動(dòng)以來(lái)的納秒數(shù)。該消息如下所示:自啟動(dòng)以來(lái) 10594369282958 納秒。 boost::chrono::steady_clock 測(cè)量自上次啟動(dòng)以來(lái)經(jīng)過(guò)的時(shí)間。但是,自上次啟動(dòng)后開(kāi)始測(cè)量是一個(gè)實(shí)現(xiàn)細(xì)節(jié)。參考點(diǎn)可能會(huì)隨著不同的實(shí)現(xiàn)而改變。
并非所有平臺(tái)都支持 boost::chrono::steady_clock。只有定義了宏 BOOST_CHRONO_HAS_CLOCK_STEADY 時(shí),時(shí)鐘才可用。
boost::chrono::high_resolution_clock 是 boost::chrono::system_clock 或 boost::chrono::steady_clock 的類(lèi)型定義,具體取決于哪個(gè)時(shí)鐘更精確地測(cè)量時(shí)間。因此,輸出與 boost::chrono::high_resolution_clock 所基于的時(shí)鐘的輸出相同。
boost::chrono::process_real_cpu_clock 返回進(jìn)程運(yùn)行的 CPU 時(shí)間。時(shí)鐘測(cè)量程序啟動(dòng)后的時(shí)間。示例 37.1 將一個(gè)字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:自進(jìn)程啟動(dòng)以來(lái)的 1000000 納秒。
您也可以使用 ctime 中的 std::clock() 獲得這個(gè)時(shí)間。事實(shí)上,目前 boost::chrono::process_real_cpu_clock 的實(shí)現(xiàn)是基于 std::clock() 的。
只有定義了宏 BOOST_CHRONO_HAS_PROCESS_CLOCKS 才能使用 boost::chrono::process_real_cpu_clock 時(shí)鐘和其他測(cè)量 CPU 時(shí)間的時(shí)鐘。
boost::chrono::process_user_cpu_clock 返回進(jìn)程在用戶(hù)空間中花費(fèi)的 CPU 時(shí)間。用戶(hù)空間是指與操作系統(tǒng)功能分開(kāi)運(yùn)行的代碼。在程序調(diào)用的操作系統(tǒng)函數(shù)中執(zhí)行代碼所花費(fèi)的時(shí)間不計(jì)入用戶(hù)空間時(shí)間。
boost::chrono::process_user_cpu_clock 只返回在用戶(hù)空間運(yùn)行的時(shí)間。如果程序暫停了一段時(shí)間,例如通過(guò) Windows Sleep() 函數(shù),則在 Sleep() 中花費(fèi)的時(shí)間不會(huì)由 boost::chrono::process_user_cpu_clock 測(cè)量。
示例 37.1 將一個(gè)字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:自進(jìn)程啟動(dòng)以來(lái)的 15600100 納秒。
boost::chrono::process_system_cpu_clock 類(lèi)似于 boost::chrono::process_user_cpu_clock。然而,這個(gè)時(shí)鐘測(cè)量在內(nèi)核空間中花費(fèi)的時(shí)間。 boost::chrono::process_system_cpu_clock 返回進(jìn)程執(zhí)行操作系統(tǒng)函數(shù)所花費(fèi)的 CPU 時(shí)間。
示例 37.1 將一個(gè)字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示: 自進(jìn)程啟動(dòng)后 0 納秒。因?yàn)檫@個(gè)例子沒(méi)有直接調(diào)用操作系統(tǒng)函數(shù)并且因?yàn)?Boost.Chrono 只使用了幾個(gè)操作系統(tǒng)函數(shù),所以 boost::chrono::process_system_cpu_clock 可能返回 0。
boost::chrono::process_cpu_clock 返回一個(gè)元組,其中包含 boost::chrono::process_real_cpu_clock、boost::chrono::process_user_cpu_clock 和 boost::chrono::process_system_cpu_clock 返回的 CPU 時(shí)間。示例 37.1 將字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:{1000000;15600100;0} 自進(jìn)程啟動(dòng)后的納秒。
boost::chrono::thread_clock 返回線程使用的時(shí)間。 boost::chrono::thread_clock 測(cè)量的時(shí)間與 CPU 時(shí)間相當(dāng),除了它是每個(gè)線程而不是每個(gè)進(jìn)程。 boost::chrono::thread_clock 返回線程運(yùn)行的 CPU 時(shí)間。它不區(qū)分在用戶(hù)空間和內(nèi)核空間中花費(fèi)的時(shí)間。
并非所有平臺(tái)都支持 boost::chrono::thread_clock。如果定義了宏 BOOST_CHRONO_HAS_THREAD_CLOCK,則只能使用 boost::chrono::thread_clock。
Boost.Chrono 提供宏 BOOST_CHRONO_THREAD_CLOCK_IS_STEADY 來(lái)檢測(cè) boost::chrono::thread_clock 是否像 boost::chrono::steady_clock 一樣測(cè)量單調(diào)時(shí)間。
示例 37.1 將字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:自線程啟動(dòng)以來(lái)的 15600100 納秒。
Boost.Chrono 中的所有時(shí)鐘都依賴(lài)于操作系統(tǒng)功能;因此,操作系統(tǒng)決定了返回時(shí)間的精確度和可靠性。
例 37.2。使用 Boost.Chrono 增加和減少持續(xù)時(shí)間
#include <boost/chrono.hpp> #include <iostream> using namespace boost::chrono; int main() { process_real_cpu_clock::time_point p = process_real_cpu_clock::now(); std::cout << p << '\n'; std::cout << p - nanoseconds{1} << '\n'; std::cout << p + milliseconds{1} << '\n'; std::cout << p + seconds{1} << '\n'; std::cout << p + minutes{1} << '\n'; std::cout << p + hours{1} << '\n'; }
now() 為所有時(shí)鐘返回 boost::chrono::time_point 類(lèi)型的對(duì)象。這種類(lèi)型與時(shí)鐘緊密耦合,因?yàn)闀r(shí)間點(diǎn)是相對(duì)于由時(shí)鐘定義的參考時(shí)間點(diǎn)測(cè)量的。 boost::chrono::time_point 是一個(gè)模板,它需要時(shí)鐘的類(lèi)型作為參數(shù)。每種時(shí)鐘類(lèi)型都為其專(zhuān)門(mén)的 boost::chrono::time_point 提供類(lèi)型定義。例如,process_real_cpu_clock 的類(lèi)型定義是 process_real_cpu_clock::time_point。
Boost.Chrono 還提供了類(lèi) boost::chrono::duration,它描述了持續(xù)時(shí)間。因?yàn)?boost::chrono::duration 也是一個(gè)模板,所以 Boost.Chrono 提供了六個(gè)類(lèi) boost::chrono::nanoseconds, boost::chrono::milliseconds, boost::chrono::microseconds, boost::chrono::秒、boost::chrono::minutes 和 boost::chrono::hours,它們更易于使用。
Boost.Chrono 重載了幾個(gè)運(yùn)算符來(lái)處理時(shí)間點(diǎn)和持續(xù)時(shí)間。示例 37.2 從 p 中減去持續(xù)時(shí)間或?qū)⒊掷m(xù)時(shí)間添加到 p 以獲得新的時(shí)間點(diǎn),這些時(shí)間點(diǎn)將寫(xiě)入標(biāo)準(zhǔn)輸出。
示例 37.2 以納秒為單位顯示所有時(shí)間點(diǎn)。 Boost.Chrono 在處理時(shí)間點(diǎn)和持續(xù)時(shí)間時(shí)自動(dòng)使用最小單位,以確保結(jié)果盡可能精確。如果您想將時(shí)間點(diǎn)與另一個(gè)單元一起使用,則必須對(duì)其進(jìn)行投射。
例 37.3。使用 boost::chrono::time_point_cast() 投射時(shí)間點(diǎn)
#include <boost/chrono.hpp> #include <iostream> using namespace boost::chrono; int main() { process_real_cpu_clock::time_point p = process_real_cpu_clock::now(); std::cout << p << '\n'; std::cout << time_point_cast<minutes>(p) << '\n'; }
boost::chrono::time_point_cast() 函數(shù)的使用類(lèi)似于強(qiáng)制轉(zhuǎn)換運(yùn)算符。示例 37.3 使用 boost::chrono::time_point_cast() 將基于納秒的時(shí)間點(diǎn)轉(zhuǎn)換為以分鐘為單位的時(shí)間點(diǎn)。在這種情況下,您必須使用 boost::chrono::time_point_cast() ,因?yàn)闀r(shí)間點(diǎn)不能以不太精確的單位(分鐘)表示而不會(huì)丟失精度。您不需要 boost::chrono::time_point_cast() 從不太精確的單位轉(zhuǎn)換為更精確的單位。
Boost.Chrono 還為持續(xù)時(shí)間提供強(qiáng)制轉(zhuǎn)換運(yùn)算符。
例 37.4。使用 boost::chrono::duration_cast() 投射持續(xù)時(shí)間
#include <boost/chrono.hpp> #include <iostream> using namespace boost::chrono; int main() { minutes m{1}; seconds s{35}; std::cout << m + s << '\n'; std::cout << duration_cast<minutes>(m + s) << '\n'; }
示例 37.4 使用函數(shù) boost::chrono::duration_cast() 將持續(xù)時(shí)間從秒轉(zhuǎn)換為分鐘。此示例將 1 分鐘寫(xiě)入標(biāo)準(zhǔn)輸出。
例 37.5。舍入持續(xù)時(shí)間
#include <boost/chrono.hpp> #include <iostream> using namespace boost::chrono; int main() { std::cout << floor<minutes>(minutes{1} + seconds{45}) << '\n'; std::cout << round<minutes>(minutes{1} + seconds{15}) << '\n'; std::cout << ceil<minutes>(minutes{1} + seconds{15}) << '\n'; }
Boost.Chrono 還提供了在施法時(shí)舍入持續(xù)時(shí)間的功能。 boost::chrono::round() 向上或向下舍入, boost::chrono::floor() 向下舍入, boost::chrono::ceil() 向上舍入。 boost::chrono::floor() 使用 boost::chrono::duration_cast() - 這兩個(gè)函數(shù)之間沒(méi)有區(qū)別。
示例 37.5 將 1 分鐘、1 分鐘和 2 分鐘寫(xiě)入標(biāo)準(zhǔn)輸出。
例 37.6。用于用戶(hù)定義輸出的流操縱器
#define BOOST_CHRONO_VERSION 2 #include <boost/chrono.hpp> #include <boost/chrono/chrono_io.hpp> #include <iostream> using namespace boost::chrono; int main() { std::cout << symbol_format << minutes{10} << '\n'; std::cout << time_fmt(boost::chrono::timezone::local, "%H:%M:%S") << system_clock::now() << '\n'; }
Boost.Chrono 提供了各種流操縱器來(lái)格式化時(shí)間點(diǎn)和持續(xù)時(shí)間的輸出。例如,使用操縱器 boost::chrono::symbol_format(),時(shí)間單位被寫(xiě)為符號(hào)而不是名稱(chēng)。因此,示例 37.6 顯示 10 分鐘。
操縱器 boost::chrono::time_fmt() 可用于設(shè)置時(shí)區(qū)和格式字符串。時(shí)區(qū)必須設(shè)置為 boost::chrono::timezone::local 或 boost::chrono::timezone::utc。格式字符串可以使用標(biāo)志來(lái)引用時(shí)間點(diǎn)的各種組件。例如,示例 37.6 將一個(gè)字符串寫(xiě)入標(biāo)準(zhǔn)輸出,如下所示:15:46:44。
除了流操縱器,Boost.Chrono 還為許多不同的定制提供了方面。例如,有一個(gè)方面可以以另一種語(yǔ)言輸出時(shí)間點(diǎn)。
注意
自 Boost 1.52.0 以來(lái)有兩個(gè)版本的輸入/輸出函數(shù)。從 Boost 1.55.0 開(kāi)始,默認(rèn)使用較新的版本。如果您使用早于 1.55.0 的版本,則必須定義宏 BOOST_CHRONO_VERSION 并將其設(shè)置為 2 才能使示例 37.6 正常工作。
到此這篇關(guān)于C++ Boost Chrono實(shí)現(xiàn)計(jì)時(shí)碼表流程詳解的文章就介紹到這了,更多相關(guān)C++ Boost Chrono內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++高精度計(jì)時(shí)的幾種方法總結(jié)(測(cè)試函數(shù)運(yùn)行時(shí)間)
本文介紹了C++中常用的幾種程序計(jì)時(shí)方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫(kù)函數(shù),這篇文章主要介紹了C++高精度計(jì)時(shí)的幾種方法,需要的朋友可以參考下2024-09-09淺談C++對(duì)象的內(nèi)存分布和虛函數(shù)表
下面小編就為大家?guī)?lái)一篇淺談C++對(duì)象的內(nèi)存分布和虛函數(shù)表。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C語(yǔ)言時(shí)間函數(shù)之strftime()詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言時(shí)間函數(shù)之strftime(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02C語(yǔ)言中static與extern關(guān)鍵字的深入解析
在C語(yǔ)言編程中,static和extern是兩個(gè)非常重要的關(guān)鍵字,它們各自有著獨(dú)特的用途,本文將深入探討這兩個(gè)關(guān)鍵字的工作原理、底層實(shí)現(xiàn)機(jī)制以及在實(shí)際開(kāi)發(fā)中的應(yīng)用,感興趣的小伙伴跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧2024-09-09關(guān)于AVLTree(C++實(shí)現(xiàn))沒(méi)有統(tǒng)一旋轉(zhuǎn)操作的問(wèn)題
這篇文章主要介紹了關(guān)于AVLTree(C++實(shí)現(xiàn))沒(méi)有統(tǒng)一旋轉(zhuǎn)操作的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02c語(yǔ)言設(shè)計(jì)模式之單例模式中的餓漢與懶漢詳解
這篇文章主要介紹了c語(yǔ)言設(shè)計(jì)模式之單例模式中的餓漢與懶漢詳解,單例模式是指一個(gè)類(lèi)只能創(chuàng)建一個(gè)對(duì)象,保證系統(tǒng)中該類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)可供訪問(wèn)的全局訪問(wèn)點(diǎn),該實(shí)例被所有程序模塊共享,需要的朋友可以參考下2023-08-08