首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Chrono测量时间

利用Chrono测量时间
EN

Stack Overflow用户
提问于 2019-10-21 14:01:26
回答 1查看 966关注 0票数 2

我当时正和Chrono图书馆合作进行时间测量。我发现了以下代码,并知道如何使用它。

代码语言:javascript
复制
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()?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-21 14:18:04

下面是对您的Timer的轻微重写。我将解释我在下面所做的每一个改变:

代码语言:javascript
复制
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;
    }
};

  • I从high_resolution_clock切换到steady_clock,因为high_resolution_clock总是typedefsteady_clocksystem_clock。关于这两个时钟之间的差异,请参见https://stackoverflow.com/a/31553641/576911。我更喜欢选择steady_clocksystem_clock,所以我知道自己是什么,steady_clock只是一种更简洁的命名类型std::chrono::time_point<std::chrono::steady_clock>的方法。两者都是correct.
  • When,减去两个time_point,就可以得到一个持续时间。只需减去time_point,获取持续时间,然后将持续时间转换到所需的精度就更简单了。您所拥有的不是不正确的,只是一种更复杂、更不安全的方法来实现相同的result.
  • Unfortunately打印,必须使用.count()成员函数从Duration中提取积分值。我避免这样做,直到最后一次声明,因为它类似于一个危险的reinterpret_cast从持续时间到积分。在C++20中,您将不再需要使用.count()打印持续时间。
  • --我更喜欢在函数作用域中发出using namespace std::chrono;,而不是多次写入std::chrono::。我只是觉得它更易读,但这只是我对readability.

的主观看法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58487924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档