網站首頁 編程語言 正文
一、Boost.Chrono說明
庫 Boost.Chrono 提供了多種時鐘。例如,您可以獲取當前時間,也可以測量流程中經過的時間。
Boost.Chrono 的部分內容已添加到 C++11。如果您的開發環境支持 C++11,您可以訪問頭文件 chrono.xml 中定義的多個時鐘。但是,C++11 不支持某些功能,例如用于測量 CPU 時間的時鐘。此外,只有 Boost.Chrono 支持用戶定義的時間輸出格式。
二、示例代碼
您可以通過頭文件 boost/chrono.hpp 訪問所有 Boost.Chrono 時鐘。唯一的擴展是用戶定義的格式,它需要頭文件 boost/chrono_io.hpp。
例 37.1。來自 Boost.Chrono 的所有時鐘
#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
}
Example37.1
例 37.1 介紹了 Boost.Chrono 提供的所有時鐘。所有時鐘都有一個共同的成員函數 now(),它返回一個時間點。所有時間點都相對于普遍有效的時間點。這個參考時間點稱為紀 元。一個經常使用的紀 元是 1970 年 1 月 1 日。示例 37.1 為顯示的每個時間點寫入紀 元。
Boost.Chrono 包括以下時鐘:
boost::chrono::system_clock 返回系統時間。這是通常顯示在計算機桌面上的時間。如果您更改計算機上的時間,boost::chrono::system_clock 會返回新時間。示例 37.1 將字符串寫入標準輸出,如下所示:自 1970 年 1 月 1 日以來的 13919594042183544 [1/10000000] 秒。
對于 boost::chrono::system_clock,epoch 沒有標準化。這些示例中使用的紀 元 1970 年 1 月 1 日取決于實現。但是,如果您特別想獲取自 1970 年 1 月 1 日以來的時間,請調用 to_time_t()。 to_time_t() 是一個靜態成員函數,它以 std::time_t 形式返回自 1970 年 1 月 1 日以來的當前系統時間秒數。
boost::chrono::steady_clock 是一個時鐘,它總是在稍后訪問時返回。即使在計算機上設置了時間, boost::chrono::steady_clock 也會返回稍后的時間。這個時間被稱為單調時間。
示例 37.1 顯示自系統啟動以來的納秒數。該消息如下所示:自啟動以來 10594369282958 納秒。 boost::chrono::steady_clock 測量自上次啟動以來經過的時間。但是,自上次啟動后開始測量是一個實現細節。參考點可能會隨著不同的實現而改變。
并非所有平臺都支持 boost::chrono::steady_clock。只有定義了宏 BOOST_CHRONO_HAS_CLOCK_STEADY 時,時鐘才可用。
boost::chrono::high_resolution_clock 是 boost::chrono::system_clock 或 boost::chrono::steady_clock 的類型定義,具體取決于哪個時鐘更精確地測量時間。因此,輸出與 boost::chrono::high_resolution_clock 所基于的時鐘的輸出相同。
boost::chrono::process_real_cpu_clock 返回進程運行的 CPU 時間。時鐘測量程序啟動后的時間。示例 37.1 將一個字符串寫入標準輸出,如下所示:自進程啟動以來的 1000000 納秒。
您也可以使用 ctime 中的 std::clock() 獲得這個時間。事實上,目前 boost::chrono::process_real_cpu_clock 的實現是基于 std::clock() 的。
只有定義了宏 BOOST_CHRONO_HAS_PROCESS_CLOCKS 才能使用 boost::chrono::process_real_cpu_clock 時鐘和其他測量 CPU 時間的時鐘。
boost::chrono::process_user_cpu_clock 返回進程在用戶空間中花費的 CPU 時間。用戶空間是指與操作系統功能分開運行的代碼。在程序調用的操作系統函數中執行代碼所花費的時間不計入用戶空間時間。
boost::chrono::process_user_cpu_clock 只返回在用戶空間運行的時間。如果程序暫停了一段時間,例如通過 Windows Sleep() 函數,則在 Sleep() 中花費的時間不會由 boost::chrono::process_user_cpu_clock 測量。
示例 37.1 將一個字符串寫入標準輸出,如下所示:自進程啟動以來的 15600100 納秒。
boost::chrono::process_system_cpu_clock 類似于 boost::chrono::process_user_cpu_clock。然而,這個時鐘測量在內核空間中花費的時間。 boost::chrono::process_system_cpu_clock 返回進程執行操作系統函數所花費的 CPU 時間。
示例 37.1 將一個字符串寫入標準輸出,如下所示: 自進程啟動后 0 納秒。因為這個例子沒有直接調用操作系統函數并且因為 Boost.Chrono 只使用了幾個操作系統函數,所以 boost::chrono::process_system_cpu_clock 可能返回 0。
boost::chrono::process_cpu_clock 返回一個元組,其中包含 boost::chrono::process_real_cpu_clock、boost::chrono::process_user_cpu_clock 和 boost::chrono::process_system_cpu_clock 返回的 CPU 時間。示例 37.1 將字符串寫入標準輸出,如下所示:{1000000;15600100;0} 自進程啟動后的納秒。
boost::chrono::thread_clock 返回線程使用的時間。 boost::chrono::thread_clock 測量的時間與 CPU 時間相當,除了它是每個線程而不是每個進程。 boost::chrono::thread_clock 返回線程運行的 CPU 時間。它不區分在用戶空間和內核空間中花費的時間。
并非所有平臺都支持 boost::chrono::thread_clock。如果定義了宏 BOOST_CHRONO_HAS_THREAD_CLOCK,則只能使用 boost::chrono::thread_clock。
Boost.Chrono 提供宏 BOOST_CHRONO_THREAD_CLOCK_IS_STEADY 來檢測 boost::chrono::thread_clock 是否像 boost::chrono::steady_clock 一樣測量單調時間。
示例 37.1 將字符串寫入標準輸出,如下所示:自線程啟動以來的 15600100 納秒。
Boost.Chrono 中的所有時鐘都依賴于操作系統功能;因此,操作系統決定了返回時間的精確度和可靠性。
例 37.2。使用 Boost.Chrono 增加和減少持續時間
#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() 為所有時鐘返回 boost::chrono::time_point 類型的對象。這種類型與時鐘緊密耦合,因為時間點是相對于由時鐘定義的參考時間點測量的。 boost::chrono::time_point 是一個模板,它需要時鐘的類型作為參數。每種時鐘類型都為其專門的 boost::chrono::time_point 提供類型定義。例如,process_real_cpu_clock 的類型定義是 process_real_cpu_clock::time_point。
Boost.Chrono 還提供了類 boost::chrono::duration,它描述了持續時間。因為 boost::chrono::duration 也是一個模板,所以 Boost.Chrono 提供了六個類 boost::chrono::nanoseconds, boost::chrono::milliseconds, boost::chrono::microseconds, boost::chrono::秒、boost::chrono::minutes 和 boost::chrono::hours,它們更易于使用。
Boost.Chrono 重載了幾個運算符來處理時間點和持續時間。示例 37.2 從 p 中減去持續時間或將持續時間添加到 p 以獲得新的時間點,這些時間點將寫入標準輸出。
示例 37.2 以納秒為單位顯示所有時間點。 Boost.Chrono 在處理時間點和持續時間時自動使用最小單位,以確保結果盡可能精確。如果您想將時間點與另一個單元一起使用,則必須對其進行投射。
例 37.3。使用 boost::chrono::time_point_cast() 投射時間點
#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() 函數的使用類似于強制轉換運算符。示例 37.3 使用 boost::chrono::time_point_cast() 將基于納秒的時間點轉換為以分鐘為單位的時間點。在這種情況下,您必須使用 boost::chrono::time_point_cast() ,因為時間點不能以不太精確的單位(分鐘)表示而不會丟失精度。您不需要 boost::chrono::time_point_cast() 從不太精確的單位轉換為更精確的單位。
Boost.Chrono 還為持續時間提供強制轉換運算符。
例 37.4。使用 boost::chrono::duration_cast() 投射持續時間
#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';
}
Example37.4
示例 37.4 使用函數 boost::chrono::duration_cast() 將持續時間從秒轉換為分鐘。此示例將 1 分鐘寫入標準輸出。
例 37.5。舍入持續時間
#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 還提供了在施法時舍入持續時間的功能。 boost::chrono::round() 向上或向下舍入, boost::chrono::floor() 向下舍入, boost::chrono::ceil() 向上舍入。 boost::chrono::floor() 使用 boost::chrono::duration_cast() - 這兩個函數之間沒有區別。
示例 37.5 將 1 分鐘、1 分鐘和 2 分鐘寫入標準輸出。
例 37.6。用于用戶定義輸出的流操縱器
#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 提供了各種流操縱器來格式化時間點和持續時間的輸出。例如,使用操縱器 boost::chrono::symbol_format(),時間單位被寫為符號而不是名稱。因此,示例 37.6 顯示 10 分鐘。
操縱器 boost::chrono::time_fmt() 可用于設置時區和格式字符串。時區必須設置為 boost::chrono::timezone::local 或 boost::chrono::timezone::utc。格式字符串可以使用標志來引用時間點的各種組件。例如,示例 37.6 將一個字符串寫入標準輸出,如下所示:15:46:44。
除了流操縱器,Boost.Chrono 還為許多不同的定制提供了方面。例如,有一個方面可以以另一種語言輸出時間點。
注意
自 Boost 1.52.0 以來有兩個版本的輸入/輸出函數。從 Boost 1.55.0 開始,默認使用較新的版本。如果您使用早于 1.55.0 的版本,則必須定義宏 BOOST_CHRONO_VERSION 并將其設置為 2 才能使示例 37.6 正常工作。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127701966
相關推薦
- 2022-09-22 NCL:Improving Graph Collaborative Filtering with N
- 2022-04-15 python機器學習MATLAB最小二乘法的兩種解讀_python
- 2023-04-01 Android自定義View?Material?Design理念詳解_Android
- 2022-10-14 【Python】pytorch 保存模型、checkpoint
- 2022-06-15 C++?詳解數據結構中的搜索二叉樹_C 語言
- 2022-12-08 C語言如何實現成績等級判別_C 語言
- 2022-09-03 利用python合并csv文件的方式實例_python
- 2022-06-27 python中的標準庫html_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支