我正在寻找:
1: startTime := time.Now()
2: // run something here that takes a while (measured in milliseconds)
3: duration := time.Since(startTime)
但是,我需要一些不受时钟时间变化影响的东西。如果在第1行和第3行之间调整时间,则持续时间将不准确。
解决此问题的常用方法有哪些,Go库可能与哪些相关?
谢谢:)
答案 0 :(得分:2)
对于Linux(AMD64),请将clock_gettime
与CLOCK_REALTIME
一起使用。
请参阅time·now
implementation。
你需要一个单调时钟(CLOCK_MONOTONIC
或CLOCK_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 docs和design document。