如何从 <chrono> 获取持续时间,如整数毫秒和浮点秒?

Posted

技术标签:

【中文标题】如何从 <chrono> 获取持续时间,如整数毫秒和浮点秒?【英文标题】:How to get duration, as int milli's and float seconds from <chrono>? 【发布时间】:2013-01-01 17:09:36 【问题描述】:

我正在尝试将 chrono 库用于计时器和持续时间。

我希望能够拥有一个Duration frameStart;(从应用程序开始) 和Duration frameDelta;(帧之间的时间)

我需要能够将frameDelta 的持续时间设为毫秒和浮点秒。

您如何使用新的 c++11 &lt;chrono&gt; 库来做到这一点?我一直在研究它并在谷歌上搜索(信息很少)。代码大量模板化,需要特殊的演员表和东西,我不知道如何正确使用这个库。

【问题讨论】:

将持续时间分配给具有比率秒(或毫秒)的持续时间,然后在其上调用count... auto delta = duration_cast (frameDelta).count();像这样?它返回 long long 而不是浮点数。 @K-ballo,如果持续时间的分辨率高于您分配给它的类型,那么分配将是错误的,以避免丢失精度。您需要使用浮点表示的持续时间,或使用duration_cast @JonathanWakely:哦,那我一直用错了! :( 【参考方案1】:

这是你要找的吗?

#include <chrono>
#include <iostream>

int main()

    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto t0 = Time::now();
    auto t1 = Time::now();
    fsec fs = t1 - t0;
    ms d = std::chrono::duration_cast<ms>(fs);
    std::cout << fs.count() << "s\n";
    std::cout << d.count() << "ms\n";

对我来说打印出来:

6.5e-08s
0ms

【讨论】:

为什么不在fsd 上使用auto @rhalbersma:auto 的使用对d 来说是可以的,因为duration_cast&lt;ms&gt; 的结果是ms。但是对于fsauto 不合适,因为t1-t0 的结果类型为high_resolution_clock::duration,它不一定与duration&lt;float&gt; 相同。例如在我的系统上是duration&lt;long long, nano&gt;。所以在那一行发生了从基于整数的nanoseconds到基于浮点的seconds的隐式转换,只是因为目标类型是用fsec指定的。 这是有用的信息。只是好奇:auto fs = std::chrono::duration_cast&lt;fsec&gt;(t1 - t0); 会不会是迂腐的矫枉过正? @rhalbersma:这也可以,并且做同样的事情。至于应该首选哪个,就我而言完全是风格。 请注意,在某些现实世界的场景中(例如 ms 编译器和库),“high_resolution_clock”会错过微秒级的时间,并且此代码会吐出零,【参考方案2】:

猜测您要的是什么。我假设您正在寻找类似于以下行为的毫秒帧计时器,

double mticks()

    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;

但改用std::chrono

double mticks()

    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> duration;

    static clock::time_point start = clock::now();
    duration elapsed = clock::now() - start;
    return elapsed.count();

希望这会有所帮助。

【讨论】:

欢迎来到 Stack Overflow。如果您可以为您的代码提供额外的详细信息,那就太好了。它将帮助其他人了解您要完成的工作以及您的解决方案的工作原理。谢谢! 仅供参考——这是我审查的几十个例子中最清晰、最有用的例子。感谢您使永远令人困惑的计时功能变得易于理解。 为什么将start设为静态?这可能会导致编译器对其进行保护。你的意思是const 吗?【参考方案3】:

我不知道“毫秒和浮点秒”是什么意思,但这应该给你一个想法:

#include <chrono>
#include <thread>
#include <iostream>

int main()

  auto then = std::chrono::system_clock::now();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto now = std::chrono::system_clock::now();
  auto dur = now - then;
  typedef std::chrono::duration<float> float_seconds;
  auto secs = std::chrono::duration_cast<float_seconds>(dur);
  std::cout << secs.count() << '\n';

【讨论】:

我猜他想要实际的count 作为float 这就是最后打印的内容。但我不知道他是想要毫秒作为整数,还是秒后的毫秒,或者什么。 我希望能够从 chrono::duration 中获取表示为 int 毫秒或浮点秒(秒的小数)的持续时间 霍华德的回答正是如此【参考方案4】:

在AAA style 中使用explicitly typed initializer idiom:

#include <chrono>
#include <iostream>

int main()
  auto start = std::chrono::high_resolution_clock::now();
  // Code to time here...
  auto end = std::chrono::high_resolution_clock::now();

  auto dur = end - start;
  auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
  auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
  std::cout << i_millis.count() << '\n';
  std::cout << f_secs.count() << '\n';

【讨论】:

以上是关于如何从 <chrono> 获取持续时间,如整数毫秒和浮点秒?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rust chrono 获得 1 天的持续时间?

如何计算两个 chrono::DateTime 之间的持续时间?

C++ chrono 获取当前时间

std c++ 获取运行时间封装

C++每日一练4.获取当前系统时间系统时间戳

如何从使用 jquery 动态创建的视频标签中获取视频持续时间?