【发布时间】:2016-01-14 02:53:33
【问题描述】:
我正在尝试使用以下代码:
std::chrono::high_resolution_clock::now();
获取时间戳,但我需要它作为双精度,但它不是支持数据类型,自动工作,但我无法操作它。
【问题讨论】:
-
为什么需要它作为替身?你的时间单位是多少?
-
一般来说,使用毫秒等整数单位可能比使用双精度数更准确。
我正在尝试使用以下代码:
std::chrono::high_resolution_clock::now();
获取时间戳,但我需要它作为双精度,但它不是支持数据类型,自动工作,但我无法操作它。
【问题讨论】:
您的“时间戳”是<chrono> 库所称的time_point。 time_point 是时钟和持续时间的集合。持续时间是表示和周期的集合。
您指定了这三个中的两个:
clock == high_resolution_clockrepresentation == doubleperiod == ?您的周期可以是nano (ratio<1, 1000000000>)、milli (ratio<1, 1000>)、seconds (ratio<1>)、minutes (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();
high_resolution_clock::now() 发出的time_point 将使用双精度表示和一个比率周期 隐式转换为您的time_point。自high_resolution_clock 的纪元以来,它将保持小数秒。
一般来说,因为您的目标类型具有浮点表示,所有 time_point 源类型都会隐式转换为它。要反向转换,您需要使用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。如果您的time_point 需要与民用日历有某种关系,或者需要跨流程保持意义,请使用system_clock。如果您的 time_point 仅在同一进程内的短时间内使用,请使用 steady_clock。
high_resolution_clock(事实上)始终是system_clock 或steady_clock 的别名。所以你不妨使用后者之一,并知道你得到了什么。
using clock = std::chrono::system_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();
【讨论】:
double ts = tp.time_to_epoch().count(); ?
.count()(以及就此而言.time_to_epoch())通常被这个库的新手过度使用。初学者将调用now() 并立即 摆脱chrono 库的类型安全。我一直在进行长达十年的运动来阻止这种情况。我宁愿直接回答有关如何获取double 的问题,这样我就可以了解为什么需要它。一旦知道“为什么”,.count() 的答案很有可能是错误的。
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 替换为您想要的任何分辨率。
【讨论】: