在C++开发中,测量代码执行耗时、实现定时功能是常见需求,C++11引入的chrono标准库提供了统一且高精度的时间处理能力,完全可以替代传统C风格的时间函数完成这类任务。chrono库的核心设计围绕三个概念展开,分别是时钟、时间点和时长,理解这三个概念就能快速实现各类计时相关功能。

chrono库核心组件说明
1. 时钟(Clock)
chrono库提供了三种常用时钟,不同场景下可以选择合适的时钟类型:
- system_clock:系统实时时钟,对应系统当前的时间,可转换为日历时间,适合需要获取真实时间的场景
- steady_clock:单调时钟,时间是线性递增的,不会受系统时间调整的影响,适合测量代码耗时、间隔计时等场景
- high_resolution_clock:高精度时钟,通常是steady_clock的别名,提供当前系统可用的最高精度时间
2. 时间点(Time Point)
时间点是某个时钟对应的具体时刻,通过时钟类型::time_point定义,比如steady_clock::time_point就表示steady_clock对应的某个时间点。我们可以通过时钟的now()方法获取当前的时间点。
3. 时长(Duration)
时长表示两个时间点之间的时间间隔,通过duration模板类定义,第一个模板参数是数值类型,第二个是时间单位,比如duration<int, milli>表示以毫秒为单位的时长。chrono库预定义了很多常用时长类型,比如seconds、milliseconds、microseconds等,方便直接使用。
场景一:测量代码执行耗时
测量代码耗时是chrono最常见的用法,我们选择steady_clock来保证计时的稳定性,避免系统时间调整带来的误差。核心思路是记录代码执行前后的两个时间点,计算两者的差值得到耗时。
下面是完整的实现代码:
#include <iostream>
#include <chrono>
#include <thread> // 用于模拟耗时操作
using namespace std;
using namespace std::chrono;
int main() {
// 记录开始时间点
steady_clock::time_point start = steady_clock::now();
// 模拟一段耗时操作,休眠1.5秒
this_thread::sleep_for(milliseconds(1500));
// 记录结束时间点
steady_clock::time_point end = steady_clock::now();
// 计算时间差,默认单位是steady_clock的周期对应的单位
duration<double> elapsed = duration_cast<duration<double>>(end - start);
// 输出不同单位的耗时
cout << "代码执行总耗时:" << elapsed.count() << " 秒" << endl;
cout << "代码执行总耗时:" << duration_cast<milliseconds>(end - start).count() << " 毫秒" << endl;
cout << "代码执行总耗时:" << duration_cast<microseconds>(end - start).count() << " 微秒" << endl;
return 0;
}
代码中使用duration_cast进行时长单位的转换,因为不同时间点的差值默认是时钟对应的原生时长类型,转换为我们需要的单位时需要显式转换。运行上述代码,输出结果会接近1500毫秒,符合我们模拟的休眠时长。
场景二:实现简单定时触发功能
除了测量耗时,我们还可以用chrono实现简单的定时功能,比如每隔固定时间执行一次任务,或者等待指定时间后执行某个操作。下面的示例实现了每隔500毫秒打印一次当前计数的定时任务,总共执行5次。
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main() {
int count = 0;
// 定义定时间隔为500毫秒
milliseconds interval(500);
while (count < 5) {
// 记录本次任务开始的时间点
steady_clock::time_point task_start = steady_clock::now();
// 执行定时任务
cout << "第 " << count + 1 << " 次定时任务执行,当前时间戳:" << system_clock::now().time_since_epoch().count() << endl;
count++;
// 计算本次任务耗时
steady_clock::time_point task_end = steady_clock::now();
milliseconds task_cost = duration_cast<milliseconds>(task_end - task_start);
// 如果任务耗时小于定时间隔,就休眠剩余时间
if (task_cost < interval) {
this_thread::sleep_for(interval - task_cost);
}
}
return 0;
}
这个实现中,我们每次执行任务后计算任务本身的耗时,然后休眠剩余的间隔时间,保证两次任务执行的间隔尽量接近设定的500毫秒。如果任务本身耗时超过了定时间隔,就不会额外休眠,直接执行下一次任务。
注意事项
- 测量代码耗时优先选择steady_clock,避免系统时间修改、时区调整等操作影响计时结果
- 时长转换时如果使用
duration_cast,是显式转换,避免精度丢失的隐式转换问题 - 如果需要获取当前的日历时间,可以使用system_clock,通过
system_clock::to_time_t方法转换为time_t类型,再配合本地时间函数使用 - 不同平台的high_resolution_clock精度可能有差异,如果需要统一精度,可以显式指定时长类型的单位
chrono库是C++标准库的一部分,不需要额外安装第三方依赖,只要编译器支持C++11及以上标准就可以直接使用,兼容性非常好。
C++计时器C++_chrono时间测量代码实现修改时间:2026-07-21 12:48:28