如何获得双倍的高分辨率时间戳?

时间:2016-01-14 02:53:34

标签: c++ timestamp chrono

我正在尝试使用以下代码:

std::chrono::high_resolution_clock::now();

获取时间戳,但我需要它作为双倍,但它不是支持数据类型,自动工作,但我无法操纵它。

2 个答案:

答案 0 :(得分:1)

你的&#34;时间戳&#34;是<chrono>库调用time_point的内容。 time_point是时钟和持续时间的集合。持续时间是表示和句点的集合。

你已经指定了这三个中的两个:

  • clock == high_resolution_clock
  • representation == double
  • period ==

您的时间段可以是nanoratio<1, 1000000000>),milliratio<1, 1000>),secondsratio<1>),{{1} }(minutes)或与秒的任何其他理性关系。

例如,让我们说你想要一个时间戳,使用double作为表示,秒作为句点。这看起来像这样:

ratio<60>

using clock = std::chrono::high_resolution_clock; using dsec = std::chrono::duration<double>; using tps = std::chrono::time_point<clock, dsec>; tps tp = clock::now(); 发出的time_point将使用double的表示和比率&lt; 1&gt;的句点隐式转换为high_resolution_clock::now()。从time_point的时代开始,它将保持小数秒。

通常,因为您的目标类型具有浮点表示,所有time_point源类型将隐式转换为它。要反向转换,您需要使用high_resolution_clock

如果您想要保持双倍纳秒,那将看起来像:

std::chrono::time_point_cast<some-duration>(source-time_point)

作为指南,我建议您使用using clock = std::chrono::high_resolution_clock; using dns = std::chrono::duration<double, std::nano>; using tpns = std::chrono::time_point<clock, dns>; tpns tp = clock::now(); system_clock,而不是steady_clock。如果您的high_resolution_clock需要与民事日历有某种关系,或者需要在各个流程中保持意义,请使用system_clock。如果time_point仅在同一过程中的短时间段内使用,请使用steady_clock

time_point(事实上)始终是high_resolution_clocksystem_clock的别名。所以你不妨使用后者之一,并知道你得到了什么。

steady_clock

答案 1 :(得分:0)

std::chrono::high_resolution_clock::now()会返回std::time_point<std::chrono::high_resolution_clock>。在这里,您可以选择是否要使用std::chrono::duration以纳秒,微秒,毫秒等表示此时间点,并最终将其转换为double

std::chrono::time_point<std::chrono::high_resolution_clock> tp = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::micro> dur = tp;
double micros = dur.count();

在这里,您可以用您想要的任何分辨率替换std::micro