![](/img/trans.png)
[英]Overflow in std::chrono::duration for remaining time measurement
[英]Using Chrono for Time Measurement
我正在使用 Chrono 庫進行時間測量。 我找到了以下代碼,並且知道如何使用它。
class Timer {
private:
std::chrono::time_point<std::chrono::high_resolution_clock> pr_StartTime;
std::chrono::time_point<std::chrono::high_resolution_clock> pr_EndTime;
public:
Timer()
{
Start();
}
~Timer()
{
Finish();
}
void Start()
{
pr_StartTime = std::chrono::high_resolution_clock::now();
}
void Finish()
{
pr_EndTime = std::chrono::high_resolution_clock::now();
auto StartTimeMs = std::chrono::time_point_cast<std::chrono::microseconds>(pr_StartTime).time_since_epoch().count();
auto EndTimeMs = std::chrono::time_point_cast<std::chrono::microseconds>(pr_EndTime).time_since_epoch().count();
auto Duration = EndTimeMs - StartTimeMs;
std::cout << "Duration " << Duration << " microseconds." << std::endl;
}
};
但我沒有意識到為什么開發人員在鑄造步驟中使用 time_since_epoch().count() 。 為什么我們應該使用 time_since_epoch() 和 count()?
這是對您的Timer
的輕微重寫。 我將在下面解釋我所做的每項更改:
class Timer {
private:
std::chrono::steady_clock::time_point pr_StartTime;
std::chrono::steady_clock::time_point pr_EndTime;
public:
Timer()
{
Start();
}
~Timer()
{
Finish();
}
void Start()
{
pr_StartTime = std::chrono::steady_clock::now();
}
void Finish()
{
using namespace std::chrono;
pr_EndTime = steady_clock::now();
auto Duration = duration_cast<microseconds>(pr_EndTime-pr_StartTime);
std::cout << "Duration " << Duration.count() << " microseconds." << std::endl;
}
};
我從high_resolution_clock
切換到steady_clock
因為high_resolution_clock
始終是typedef
或system_clock
的steady_clock
。 有關這兩個時鍾之間的差異,請參閱https://stackoverflow.com/a/31553641/576911 。 我更喜歡選擇steady_clock
或system_clock
,所以我知道我得到了什么。
std::chrono::steady_clock::time_point
只是一種更簡潔的命名類型std::chrono::time_point<std::chrono::steady_clock>
的方式。 兩者都是正確的。
當您減去兩個time_point
時,您會得到一個持續時間。 只需減去time_point
,獲取持續時間,然后將該持續時間轉換為所需的精度,就更簡單了。 你所擁有的並不是不正確的,只是一種更復雜、更不安全的方法來實現相同的結果。
不幸的是,要打印,必須使用 .count .count()
成員 function 從Duration
中提取整數值。 我避免在最后一個語句之前這樣做,因為它類似於從持續時間到積分的危險reinterpret_cast
。 在 C++20 中,您將不再需要使用.count()
來打印持續時間。
我更喜歡發出using namespace std::chrono;
在 function scope 而不是多次寫入std::chrono::
。 我只是覺得它更具可讀性,但這只是我對可讀性的主觀看法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.