行为
错误 #443
打开system_clock vs steady_clock
状态:
新建
优先级:
普通
指派给:
-
开始日期:
2025-09-22
计划完成日期:
% 完成:
0%
预期时间:
#2:
描述
system_clock 和 steady_clock 都是 <chrono> 提供的“时钟”,但设计目的、行为、可调整性完全不同。
一句话区分:
system_clock是“墙上的挂钟”,steady_clock是“跑表”。
对比表¶
| 特性 | system_clock |
steady_clock |
|---|---|---|
| 是否单调 | 否,可能回拨(NTP、用户手动改时间) | 是,保证永不回拨 |
| 是否可调 | 是,系统管理员/NTP 可改 | 否, 不可调,独立基准 |
| 是否映射到物理时间 | 是,对应日历/UTC 时间 | 否, 只保证相对间隔 |
| 常用用途 | 获取“现在几点” | 计时、性能测试 |
| epoch 定义 | 1970-01-01 00:00:00 UTC | 未规定(通常是开机或某固定点) |
| 精度 | 实现相关,通常 μs~ns | 实现相关,通常 μs~ns |
代码级差异¶
using namespace std::chrono;
auto t0_sys = system_clock::now(); // 可映射到 time_t / 日历
auto t0_stead = steady_clock::now(); // 只能做差值
// 示例:测量函数耗时
auto t1 = steady_clock::now();
foo();
auto t2 = steady_clock::now();
cout << duration_cast<milliseconds>(t2 - t1).count() << " ms\n";
易错点¶
- 用
system_clock做性能计时
→ 用户中途改系统时间,结果出现负值或巨大值。 - 用
steady_clock生成时间戳
→ 无法转成time_t,没有日历意义。
一句话总结¶
| 你要做的事 | 选哪个 |
|---|---|
| 打印当前日期时间 | system_clock |
| 测量代码耗时、定时器 | steady_clock |
没有任何数据可供显示
行为