我当时正和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()?
发布于 2019-10-21 14:18:04
下面是对您的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到steady_clock或system_clock。关于这两个时钟之间的差异,请参见https://stackoverflow.com/a/31553641/576911。我更喜欢选择steady_clock或system_clock,所以我知道自己是什么,steady_clock只是一种更简洁的命名类型std::chrono::time_point<std::chrono::steady_clock>的方法。两者都是correct.time_point,就可以得到一个持续时间。只需减去time_point,获取持续时间,然后将持续时间转换到所需的精度就更简单了。您所拥有的不是不正确的,只是一种更复杂、更不安全的方法来实现相同的result..count()成员函数从Duration中提取积分值。我避免这样做,直到最后一次声明,因为它类似于一个危险的reinterpret_cast从持续时间到积分。在C++20中,您将不再需要使用.count()打印持续时间。using namespace std::chrono;,而不是多次写入std::chrono::。我只是觉得它更易读,但这只是我对readability.的主观看法。
https://stackoverflow.com/questions/58487924
复制相似问题