繁体   English   中英

使用 Chrono 进行时间测量

[英]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始终是typedefsystem_clocksteady_clock 有关这两个时钟之间的差异,请参阅https://stackoverflow.com/a/31553641/576911 我更喜欢选择steady_clocksystem_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM