当前位置: 首页 > 网络知识

C++ std::chrono的时钟Clock

时间:2026-01-29 09:37:25

std::chrono是C++11引入的日期时间处理库,其中包含3种时钟:system_clock,steady_clock,high_resolution_clock。近来需要使用高精度时间,很自然想到使用high_resolution_clock,然而使用后发现并非预期的得到自1970/1/1零点之后的计数,而是一个小得多的数字。那么这三种时钟有什么区别,用在什么情况下,我们来一探究竟。

问题

1 auto tp = std::chrono::high_resolution_clock::now(); 2 std::cout << tp.time_since_epoch()ount() << std::endl;

上述代码输出一个比较小的数字,high_resolution_clock的精度是纳秒,不可能是这么小的数字。

三种时钟的区别

所谓时钟,是指从一个时点开始,按照某个刻度的一个计数。如下代码摘自VC2017。

1 struct system_clock 2 { // wraps GetSystemTimePreciseAsFileTime/GetSystemTimeAsFileTime 3 typedef long long rep; 4 typedef ratio_multiply<ratio<_XTIME_NSECS_PER_TICK, 1>, nano> period; 5 typedef chrono::duration<rep, period> duration; 6 typedef chrono::time_point<system_clock> time_point; 7 static constexpr bool is_steady = false;

对于system_clock,其起点是epoch,即19700101 00:00:00 UTC,其刻度是1个tick,也就是_XTIME_NSECS_PER_TICK纳秒。

typedef steady_clock high_resolution_clock;

high_resolution_clock实际上和steady_clock一样。

1 struct steady_clock 2 { // wraps QueryPerformanceCounter 3 typedef long long rep; 4 typedef nano period; 5 typedef nanoseconds duration; 6 typedef chrono::time_point<steady_clock> time_point; 7 static constexpr bool is_steady = true;

steady_clock的刻度是1纳秒,起点并非19700101 00:00:00 UTC,一般是系统启动时间,这就是问题的关键。steady_clock的作用是为了得到不随系统时间修改而变化的时间间隔,所以凡是想得到绝对时点的用法都是错误的。steady_clock是没有to_time_t()的实现的,而system_clock是有的。

三种时钟用在什么时候

1 auto tp = std::chrono::system_clock::now(); 2 std::time_t tt = std::chrono::system_clock::to_time_t(tp); 3 std::cout << tt << "seconds fr 19700101 00:00:00 UTC" << std::endl;
1 auto tp1 = std::chrono::steady_clock::now(); 2 //do sething 3 auto tp2 = std::chrono::steady_clock::now(); 4 std::cout << std::chrono::duration_cast<std::chrono::microseconds>(tp2 tp1)ount() << "microseconds" << std::endl;

常见的错误用法



上一篇:C/C++ RECT, PRECT, NPRECT, LPRECT;它们之间有什么区别?
下一篇:C/C++ 窗口取消置顶后被父窗口挡住,HWND_TOPMOST与HWND_NOTOPMOST踩坑记录
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素