C++ std::chrono::steady_clock

2025 年 3 月 24 日 | 4 分钟阅读

C++ 对时间管理的支持在 C++11 标准开始时引入了 <chrono> 库,得到了极大的增强。在该库最常用的部分中,应该提到时钟实用程序,它们用于计算时间间隔或处理时间戳。**_steady_clock_** 类因其可靠性和一致性而引人注目,在需要精确测量时间流逝的情况下,它们是非常重要的工具。

在本文中,我们将研究 C++ 中的 std::chrono::steady_clock 函数、其目的以及如何在程序中有效使用它。

什么是 std::chrono::steady_clock?

std::chrono::steady_clock 是 C++ <chrono> 库提供的一种时钟类型,它是一个单调的、永不修改的时钟,这意味着任何外部因素都不应干扰它,无论是更改系统时钟还是引入夏令时,也不应手动干预。

换句话说,std::chrono::steady_clock 是确保其报告时间始终以严格恒定的速率向前移动的时钟之一,这使得测量时间间隔而不会出现任何意外中断成为可能。

这使得 steady_clock 在我们想要测量性能、函数执行时间或一般时间,并且希望时间能够稳定测量而不会受到外部源的任何干扰时特别有用。

std::chrono::steady_clock 的主要特点

std::chrono::steady_clock 函数的几个主要特点如下

  1. 单调行为: steady_clock 保证时间始终向前推进。与系统时钟(std::chrono::system_clock)不同,任何系统时间更改都不会影响它。因此,它的所有调用将始终返回严格递增的值。
  2. 不依赖于实时: 与 std::chrono::system_clock 不同,后者反映系统时钟的实时,steady_clock 对真实世界时间漠不关心。它捕获的是经过的时间,而不是受实际日期或时间的影响。因此,它不是记录绝对时间戳的好工具,但非常适合捕获时间间隔。
  3. 精度和分辨率: 精度和分辨率因系统而异,并且与硬件相关。对于大多数用例,分辨率足以测量所有性能指标,但如果我们需要高精度的时间测量,我们将需要特别关注目标系统上 steady_clock 的分辨率。
  4. 平台独立: 它以平台独立的方式实现,因此我们的代码不依赖于我们正在实现的平台。

使用 std::chrono::steady_clock

语法和类型

**_steady_clock_** 是 std::chrono 命名空间的一部分。稳定时钟的主要目的是提供可靠和稳定的时间源。与其主要相关的类型是

  • time_point: 它表示基于 steady_clock 的时间点。它用于使用时钟捕获特定时刻。
  • Duration: 两个时间点之间的差值。

以下是 std::chrono::steady_clock 类的基本语法

使用 steady_clock 测量时间持续时间

std::chrono::steady_clock 最常见的用途之一是测量两个时间点之间的持续时间。它通常用于性能基准测试,我们想知道函数或代码片段的执行时间。

这是一个简单的示例,演示如何使用 std::chrono::steady_clock 测量时间持续时间

输出

std::chrono::steady_clock in C++

说明

  • start = std::chrono::steady_clock::now(): 这里,now() 函数被调用以获取一个时间点。时间点指示函数被调用的时间。此时间点被分配给名为 start 的变量
  • std::this_thread::sleep_for: 通过让程序执行休眠 2 秒来模拟一些工作负载。
  • end = std::chrono::steady_clock::now(): 一旦休眠持续时间过去,我们记录另一个名为 end 的时间点。
  • duration = end-start: 两个时间点之间的差值是一个持续时间对象,用于测量 start 和 end 之间的时间长度。
  • std::chrono::duration_cast<std::chrono::milliseconds>: 持续时间被转换为毫秒以便于阅读。

何时使用 steady_clock

以下是 std::chrono::steady_clock 的一些典型用例

  1. 基准测试代码: 测量函数或代码段的执行时间。
  2. 超时机制: 在需要强制执行超时的场景中,steady_clock 确保任何系统时钟更改都不会影响时间测量。
  3. 性能分析: 对于需要随时间监控函数的性能分析应用程序,steady_clock 用于可靠地跟踪经过的时间。
  4. 模拟和游戏: 在实时系统(例如游戏循环或模拟)中,时间测量必须不受外部因素影响,steady_clock 是理想的选择。

std::chrono::steady_clock 的局限性

尽管有其优点,steady_clock 并非没有局限性

  1. 与系统时间无关: 由于 steady_clock 不代表实际的日历时间,因此不能用于记录时间戳或跟踪依赖于人类可读日期的真实世界事件。
  2. 在某些系统上精度有限: steady_clock 的精度和准确性取决于底层硬件和操作系统。在某些平台上,时钟可能无法提供纳秒级精度,这对于高精度任务来说可能是一个问题。
  3. 无法同步: steady_clock 无法与其他时钟(如NTP 服务器)同步或调整以匹配真实世界时间。这限制了它在需要不同系统之间时间同步的分布式系统中的使用。