定时操作不受时钟变化的影响

时间:2013-10-29 01:02:15

标签: time go

我正在寻找:

1: startTime := time.Now()

2: // run something here that takes a while (measured in milliseconds)

3: duration := time.Since(startTime)

但是,我需要一些不受时钟时间变化影响的东西。如果在第1行和第3行之间调整时间,则持续时间将不准确。

解决此问题的常用方法有哪些,Go库可能与哪些相关?

谢谢:)

2 个答案:

答案 0 :(得分:2)

对于Linux(AMD64),请将clock_gettimeCLOCK_REALTIME一起使用。 请参阅time·now implementation

你需要一个单调时钟(CLOCK_MONOTONICCLOCK_MONOTONIC_RAW) 是一个不能及时回归的时钟。在Linux中,手册页明确告诉您CLOCK_MONOTONIC不保证不会向前跳跃:

  

此时钟不受系统时间内不连续跳转的影响(例如,如果系统管理员     手动更改时钟),但受adjtime(3)和NTP执行的增量调整的影响。

所以,在Linux下,最好的选择可能是CLOCK_MONOTONIC_RAW。你可以使用 对此clock package mentioned by @MatrixFrog。例如:

import (
    "fmt"
    "github.com/davecheney/junk/clock"
    "time"
)

func main() {
    start := clock.Monotonic.Now()
    // work
    end := clock.Monotonic.Now()

    duration := end.Sub(start)

    fmt.Println("Elapsed:", duration)
}

进一步阅读:

答案 1 :(得分:2)

issue 12914(2015)

详细说明缺乏单调时钟

从那时起,2017年8月和Go 1.9,你现在有一个transparent Monotonic Time support

  

time包现在可以透明地跟踪每个Time值的单调时间,使两个Time值之间的计算持续时间在有挂钟调整的情况下成为安全操作
  有关详细信息,请参阅package docsdesign document