如何将std::chrono::duration转换为double(秒)?

27

让我们使用using duration = std::chrono::steady_clock::duration。我想要优雅地将duration转换为秒的double类型,并实现最大精度。

我已经找到了反向方法,但它没有帮助我找到答案。

或者更明确地说,我想要一个std函数double F(duration),它可以最佳地返回秒数。

3个回答

35

1
我们如何在不指定std::chrono::seconds的情况下以秒为单位获取它? - nj2237
@nj2237,std::chrono::duration 的默认 std::ratio1,表示秒。你可以使用 std::chrono::duration<double,std::ratio<1,1000>> 来获取毫秒级别的持续时间,使用 duration<double,ratio<1000,1>> 来获取千秒级别的持续时间,以此类推。 - bames53

9

std::chrono::duration 转换成任何数字“计数”都是看似简单的!

您可以除以任意两个std::chrono::duration来高效地获得一个计数。

给定周期为任何时间段的持续时间d和任何整数表示:

using std::chrono_literals;

// Want to know how many seconds?  Divide by one second!
std::int64_t int_seconds = d / 1s;
double       fp_seconds  = d / 1.0s;

如图所示,两个时间段的周期无论是多少并不重要。而最终的类型将会是这两个时间段的公共类型

5
这对我来说是最直接的方法:
auto start = std::chrono::steady_clock::now();

/*code*/

auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Duration [seconds]: " << diff.count() << std::endl;

但我不知道精度...虽然这种方法非常精确。


2
这是如何知道要以秒为单位的? - ScaryAardvark
2
表示时间段的长度,单位为秒。我相信在std::chrono::steady_clock中默认的period是秒,这就是为什么count()返回秒的原因。“对象的表示值作为时间段计数。” - Trake Vital
使用std::chrono::duration<double, std::milli> diff = end - start可以获得以毫秒为单位的差值。同样,也可以使用std::micro或std::nano。 - Hackless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接