![](/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.