如何从 <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 <chrono>
库来做到这一点?我一直在研究它并在谷歌上搜索(信息很少)。代码大量模板化,需要特殊的演员表和东西,我不知道如何正确使用这个库。
【问题讨论】:
将持续时间分配给具有比率秒(或毫秒)的持续时间,然后在其上调用count
...
auto delta = duration_castduration_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
【讨论】:
为什么不在fs
和d
上使用auto
?
@rhalbersma:auto
的使用对d
来说是可以的,因为duration_cast<ms>
的结果是ms
。但是对于fs
,auto
不合适,因为t1-t0
的结果类型为high_resolution_clock::duration
,它不一定与duration<float>
相同。例如在我的系统上是duration<long long, nano>
。所以在那一行发生了从基于整数的nanoseconds
到基于浮点的seconds
的隐式转换,只是因为目标类型是用fsec
指定的。
这是有用的信息。只是好奇:auto fs = std::chrono::duration_cast<fsec>(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> 获取持续时间,如整数毫秒和浮点秒?的主要内容,如果未能解决你的问题,请参考以下文章