我正在尝试使用以下代码:
std::chrono::high_resolution_clock::now();
我需要获取一个时间戳,但我需要它作为double类型,而它并不是支持的数据类型,auto可以工作,但我无法操作它。
我正在尝试使用以下代码:
std::chrono::high_resolution_clock::now();
我需要获取一个时间戳,但我需要它作为double类型,而它并不是支持的数据类型,auto可以工作,但我无法操作它。
<chrono>
库中所称的time_point
。 time_point
是时钟和持续时间的集合。而持续时间则是表示和周期的集合。clock == high_resolution_clock
representation == double
period ==
?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::time_point
通过双精度数值和比率<1>的时间段表示,隐式转换为您的 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();
? - lowtech.count()
(以及.time_to_epoch()
)通常被新手程序员过度使用。初学者会调用now()
,并立即跳出chrono库的类型安全性。我已经进行了长达十年的运动,以阻止这种情况的发生。我宁愿回答一个关于如何获取double
的直接问题,这样我就可以了解为什么需要它。很有可能一旦知道了“为什么”,.count()
就不是正确的答案。 - Howard Hinnantstd::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
替换为您想要的任何分辨率。