【问题标题】:Using Chrono for Time Measurement使用 Chrono 进行时间测量
【发布时间】:2019-10-21 14:01:26
【问题描述】:

我正在使用 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()?

【问题讨论】:

  • 我不知道他们为什么打电话给time_since_epoch。也许 Howard Hinnat 会有一个想法。
  • 这似乎更像是一个常见的错误,人们尽快而不是尽可能晚地逃避 chrono 类型。 Chrono 类型提供减法,您不必自己跟踪所涉及的单位。然后代码使用Ms 表示“微秒”,使情况变得更糟。

标签: c++ windows chrono


【解决方案1】:

这是对您的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 始终是typedefsteady_clocksystem_clock。请参阅https://stackoverflow.com/a/31553641/576911 了解这两个时钟之间的差异。我更喜欢选择steady_clocksystem_clock,所以我知道我会得到什么。

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

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

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

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

【讨论】:

  • 谢谢,但它对我不起作用。当我运行您的代码以对我的代码进行运行时执行测量时,它显示持续时间为 0 微秒。
  • 您可以尝试转换为纳秒。也许你正在计时的时间不到一微秒。另一种可能性是您的 Timer 对象是临时的,在同一语句中构造和销毁,并且再次计时不到一微秒。
  • 或者它可能是我刚刚在回答中更正的类型-o。 :-)
猜你喜欢
  • 2017-08-31
  • 2014-07-16
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多