技术科普

单调时钟与挂钟:程序计时该用哪一个

在程序中计时,一不小心就会用到错误的时钟。理解“单调时钟”和“挂钟”的区别,是写出正确计时逻辑的基础。

挂钟(Wall Clock)

挂钟是“真实世界的时间”,如系统时钟显示的年月日时分秒。它反映的是绝对时间,可能因为以下原因发生跳变:

  • 自动校时(NTP)把时间调准
  • 手动修改系统时间
  • 夏令时切换
  • 用户跨时区

因此,挂钟适合记录“事件发生在什么时刻”,但不适合测量时长。

单调时钟(Monotonic Clock)

单调时钟只保证单调递增,即只增不减,不受系统时间调整影响。它通常从系统启动或某个任意点开始计时。

  • 适合测量时间间隔,如某段代码耗时
  • 不反映真实日期时间,不能用来标记“几点几分”

为什么不能用挂钟测时长

如果用挂钟测量耗时,中途发生NTP校时(比如把时间往回拨1秒),耗时计算就会出现负数或错误值。而单调时钟不会,它始终向前。

各语言中的对应

  • Java:System.nanoTime() 是单调时钟,System.currentTimeMillis() 是挂钟
  • Python:time.monotonic() vs time.time()
  • Go:time.Since 内部使用单调时钟
  • C/C++:CLOCK_MONOTONIC vs CLOCK_REALTIME

实践建议

  • 记录时刻用挂钟:日志事件时间、创建时间
  • 测量耗时用单调时钟:性能计时、超时控制
  • 需要绝对时间时,务必对时钟跳变有容错

结语

“挂钟看时刻,单调钟量间隔”。分清两者,能让计时逻辑更加可靠。