c++ - 使用 Chrono 进行时间测量
问题描述
我正在使用 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
to切换到,steady_clock
因为high_resolution_clock
始终是typedef
tosteady_clock
或system_clock
。有关这两个时钟之间的差异,请参见https://stackoverflow.com/a/315536 41/576911。我更喜欢选择steady_clock
或system_clock
,所以我知道我得到了什么。std::chrono::steady_clock::time_point
只是一种更简洁的命名类型的方式std::chrono::time_point<std::chrono::steady_clock>
。两者都是正确的。当你减去两个
time_point
s 时,你会得到一个持续时间。只需减去time_point
s,获取持续时间,然后将该持续时间转换为所需的精度,就更简单了。你所拥有的并不是不正确的,只是一种更复杂、更不安全的方法来实现相同的结果。Duration
不幸的是,要打印,必须从.count()
成员函数中提取整数值。我避免在最后一个语句之前这样做,因为它类似于reinterpret_cast
从持续时间到积分的危险。在 C++20 中,您将不再需要使用.count()
来打印持续时间。我更喜欢在函数范围内发出一个而不是多次
using namespace std::chrono;
编写。std::chrono::
我只是觉得它更具可读性,但这只是我对可读性的主观看法。
推荐阅读
- r - 没有 NA 值时显示 NA 条的条形图
- react-native - 在 react-native 中淡出闪屏
- c# - 在两个 ComboBox 之间创建关系
- node.js - 如何在所有路由NodeJS中显示登录用户信息
- python - 从迭代器返回一个浮点数
- spring - 自定义错误页面路由struts 2 + spring boot
- c# - 如果网站 URL 不包含任何语言代码,则执行某些操作
- php - WooCommerce 类别和子类别的永久链接
- google-apps-script - 通过链接和不受保护的范围共享电子表格
- json - 从响应中解析 PNG(没有默认的 JSON 解析)