首页 > 解决方案 > 使用 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()?

标签: c++windowschrono

解决方案


这是对您的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_clockto切换到,steady_clock因为high_resolution_clock始终是typedeftosteady_clocksystem_clock。有关这两个时钟之间的差异,请参见https://stackoverflow.com/a/315536 ​​41/576911。我更喜欢选择steady_clocksystem_clock,所以我知道我得到了什么。

  • std::chrono::steady_clock::time_point只是一种更简洁的命名类型的方式std::chrono::time_point<std::chrono::steady_clock>。两者都是正确的。

  • 当你减去两个time_points 时,你会得到一个持续时间。只需减去time_points,获取持续时间,然后将该持续时间转换为所需的精度,就更简单了。你所拥有的并不是不正确的,只是一种更复杂、更不安全的方法来实现相同的结果。

  • Duration不幸的是,要打印,必须从.count()成员函数中提取整数值。我避免在最后一个语句之前这样做,因为它类似于reinterpret_cast从持续时间到积分的危险。在 C++20 中,您将不再需要使用.count()来打印持续时间。

  • 我更喜欢在函数范围内发出一个而不是多次using namespace std::chrono;编写。std::chrono::我只是觉得它更具可读性,但这只是我对可读性的主观看法。


推荐阅读