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

标签 c++ timestamp c++-chrono

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

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

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

最佳答案

你的“时间戳”就是<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> ) 或任何其他与秒的合理关系。

例如,假设您想要一个时间戳,使用 double 作为表示形式并使用秒作为周期。这看起来像这样:

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_pointhigh_resolution_clock::now() 发出将隐式转换为您的 time_point使用 double 的表示和 ratio<1> 的周期。自 high_resolution_clock 的纪元以来,它将保持小数秒.

通常,因为您的目标类型具有浮点表示形式,所以所有 time_point 源类型都将隐式转换为它。要反向转换,您需要使用 std::chrono::time_point_cast<some-duration>(source-time_point) .

相反,如果您想保留基于 double 的纳秒,则看起来像:

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_clocksteady_clock , 但不是 high_resolution_clock .使用 system_clock如果你的 time_point需要与民用日历有某种关系,或者需要跨进程保持意义。使用 steady_clock如果你的 time_point仅在同一过程中的短时间内使用。

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();

关于c++ - 如何获得双倍的高分辨率时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780897/

相关文章:

java - 给定日期的 System.currentTimeMillis()?

c++ - 为什么 chrono::nanoseconds 的表示类型是有符号整数类型?

c++ - `clock()` 给出通常的时钟而不是 CPU 时钟

c++ - 如何使用 std::ifstream 读取 UTF-8 编码的文本文件?

c++ - 在 Visual Studio 中显示 C++ 文件的 #include 层次结构

python - 使用Python编辑列表中的时间戳?使用函数将 POSIX 转换为可读格式

c# - 如何在C#中获取unix时间戳

c++ - 如何正确实现抽象类?

c++编译cppunit文件并执行xml报告

c++ - Std::chrono 或 boost::chrono 支持 CLOCK_MONOTONIC_COARSE