如何从<chrono>中获取持续时间(以毫秒为单位)和浮点秒?


94

我正在尝试使用chrono库作为计时器和持续时间。

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

我需要能够获得frameDelta持续时间(以毫秒为单位)和浮点秒。

如何使用新的c ++ 11<chrono>库执行此操作?我一直在努力并进行谷歌搜索(信息稀疏)。该代码是大量模板化的,需要特殊的强制类型转换和其他操作,我无法弄清楚如何正确使用此库。


将持续时间分配给具有比率秒(或毫秒)的持续时间,然后调用count它...
K-ballo

自动增量= duration_cast <seconds>(frameDelta).count(); 像这样?它长时间返回而不是浮点数。
EddieV223

3
@ K-ballo,如果持续时间的分辨率比您为其指定的类型更高,则该赋值将格式错误,以避免丢失精度。您需要使用带有浮点表示形式的持续时间,或使用duration_cast
Jonathan Wakely 2013年

@JonathanWakely:哦,那我一直用错了!:(
K-ballo

Answers:


153

这是您要找的东西吗?

#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

2
为什么不使用autoonfsd
TemplateRex

27
@rhalbersma:使用auto会很好d,因为的结果duration_cast<ms>ms。但是,forfs auto并不适合,因为的结果的t1-t0类型high_resolution_clock::duration不一定与相同duration<float>。例如在我的系统上是duration<long long, nano>。因此,在该行上发生了从基于整数到基于nanoseconds浮点数的隐式转换seconds,仅是因为目标类型是通过指定的fsec
Howard Hinnant 2013年

2
那是有用的信息。只是好奇:会不会auto fs = std::chrono::duration_cast<fsec>(t1 - t0);被过度矫正?
TemplateRex

@rhalbersma:那也一样,并且做完全一样的事情。就我而言,应该优先选择哪个完全是样式。
Howard Hinnant 2013年

2
请注意,在某些实际情况下(例如ms编译器和库),“ high_resolution_clock”将丢失微秒级的时间,并且此代码将吐出零,
jheriko

19

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

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();
}

希望这可以帮助。


欢迎使用堆栈溢出。如果您可以为代码提供其他细节,那就太好了。它可以帮助其他人了解您要完成的工作以及您的解决方案如何工作。谢谢!
路易斯·克鲁兹

仅供参考-这是我评论过的最清晰,最有用的例子。感谢您使令人困惑的计时功能变得可理解。
SMGreenfield

15

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

#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
K-ballo

1
这就是最后打印出来的内容。但是我不知道他是否要以毫秒为单位,或者以毫秒为单位,或者是什么。
Jonathan Wakely 2013年

我希望能够从chrono :: duration中获取持续时间,以int毫秒或float秒(分数)表示
EddieV223 2013年

霍华德的答案正是这样
乔纳森·韦克利

8

AAA风格中,使用显式键入的初始化器惯用语

#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';
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.