日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++?Boost?Chrono實現計時碼表流程詳解_C 語言

作者:無水先生 ? 更新時間: 2022-12-12 編程語言

一、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

欄目分類
最近更新