c++ - 不同时间段的计时?

标签 c++ c++-chrono

目前我正在使用 boost::rational<std::uint64>跟踪我的申请。

基本上我有一个运行很长一段时间的时钟,并且会被不同时间分辨率的不同组件滴答作响,例如1/50s、1/30s、1001/30000s 等...我想保持完美的精度,即没有 float 。 boost::rational为此目的效果很好,但我认为使用 std::chrono::duration 会更好。为此。

但我的问题是,如何使用 std::chrono::duration这里?由于它使用编译时间段,我不太明白如何在我需要保持精度的场景中使用它?

最佳答案

如果我理解您的问题,并且如果您知道编译时的所有不同时间分辨率,那么以下内容将满足您的要求。您可以通过在所有不同的时间分辨率上使用 common_type 来找出正确的滴答周期,如下所示:

#include <cstdint>
#include <chrono>

struct clock
{
    typedef std::uint64_t                      rep;
    typedef std::common_type
    <
        std::chrono::duration<rep, std::ratio<1, 50>>,
        std::chrono::duration<rep, std::ratio<1, 30>>,
        std::chrono::duration<rep, std::ratio<1001, 30000>>
    >::type                                    duration;
    typedef duration::period                   period;
    typedef std::chrono::time_point<clock>     time_point;
    static const bool is_steady =              true;

    static time_point now()
    {
        // just as an example
        using namespace std::chrono;
        return time_point(duration_cast<duration>(steady_clock::now().time_since_epoch()));
    }
};

这将在编译时计算最大的滴答周期,它将准确地代表您指定的每个分辨率。例如,这个时钟可以准确地表示:

  • 1/50 600 个刻度。
  • 1/30,1000 个刻度。
  • 1001/30000,有 1001 个刻度。

下面的代码运行这个时钟并使用描述的“chrono_io”工具here不仅打印出时钟的运行时滴答数,还打印出时钟滴答的编译时单位:

#include <iostream>
#include <thread>
#include "chrono_io"

int main()
{
    auto t0 = clock::now();
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
    auto t1 = clock::now();
    std::cout << (t1-t0) << '\n';
}

对我来说,这是打印出来的:

633 [1/30000]seconds

含义:调用 now() 之间有 633 个时钟滴答,每个滴答的单位是 1/30000 秒。如果您不想受制于“chrono_io”,您可以使用 clock::period::numclock::period::den 检查时钟的单位>.

如果您的不同时间分辨率不是编译时信息,那么您当前使用 boost::rational 的解决方案可能是最好的。

关于c++ - 不同时间段的计时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12787544/

相关文章:

c++ - 以下声明之间的区别

c++ - 覆盖写入控制台的文本

c++ - 链表数组

c++ - 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

c++ - std::chrono::duration::count 函数的实际结果类型是什么

c++ - 如何包含 uniform_real_distribution 的最大值

c++ - 从 vs2013 升级到 vs2017 后 <ratio> 和 <memory> 出错

c++ - 在 Linux 中监控程序的内存使用情况

c++ - 如何获取字符串输出的宽度?

c++ - 是否可以将 std::chrono::duration 与 Rep 类型一起使用为 double?我尝试在 vs2012 中遇到编译器错误