技术科普
单调时钟与挂钟:程序计时该用哪一个
在程序中计时,一不小心就会用到错误的时钟。理解“单调时钟”和“挂钟”的区别,是写出正确计时逻辑的基础。
挂钟(Wall Clock)
挂钟是“真实世界的时间”,如系统时钟显示的年月日时分秒。它反映的是绝对时间,可能因为以下原因发生跳变:
- 自动校时(NTP)把时间调准
- 手动修改系统时间
- 夏令时切换
- 用户跨时区
因此,挂钟适合记录“事件发生在什么时刻”,但不适合测量时长。
单调时钟(Monotonic Clock)
单调时钟只保证单调递增,即只增不减,不受系统时间调整影响。它通常从系统启动或某个任意点开始计时。
- 适合测量时间间隔,如某段代码耗时
- 不反映真实日期时间,不能用来标记“几点几分”
为什么不能用挂钟测时长
如果用挂钟测量耗时,中途发生NTP校时(比如把时间往回拨1秒),耗时计算就会出现负数或错误值。而单调时钟不会,它始终向前。
各语言中的对应
- Java:
System.nanoTime()是单调时钟,System.currentTimeMillis()是挂钟 - Python:
time.monotonic()vstime.time() - Go:
time.Since内部使用单调时钟 - C/C++:
CLOCK_MONOTONICvsCLOCK_REALTIME
实践建议
- 记录时刻用挂钟:日志事件时间、创建时间
- 测量耗时用单调时钟:性能计时、超时控制
- 需要绝对时间时,务必对时钟跳变有容错
结语
“挂钟看时刻,单调钟量间隔”。分清两者,能让计时逻辑更加可靠。