我正在寻找:
1: startTime := time.Now()
2: // run something here that takes a while (measured in milliseconds)
3: duration := time.Since(startTime)
但是,我需要一些不受时钟时间变化影响的东西。如果在第 1 行和第 3 行之间调整时间,则持续时间将不准确。
解决这个问题的常见方法有哪些,哪些 Go 库可能相关?
谢谢:)
第12914期(2015年)详细介绍了单调时钟的缺乏
从那时起,在 2017 年 8 月和 Go 1.9 中,您现在拥有了透明的单调时间支持:
time
包现在可以透明地跟踪每个Time
值中的单调时间,使两个Time
值之间的持续时间在存在挂钟调整的情况下成为安全操作。
有关详细信息,请参阅包文档和设计文档。
对于 Linux (AMD64),go 将clock_gettime
与 CLOCK_REALTIME
一起使用。请参阅time·now
实现。
你会想要一个单调的时钟(CLOCK_MONOTONIC
或CLOCK_MONOTONIC_RAW
),它是一个不会回到过去的时钟。在 Linux 中,手册页明确告诉您,CLOCK_MONOTONIC
并不能保证不会向前跳跃:
此时钟不受系统时间不连续跳跃的影响(例如,如果系统管理员 手动更改时钟),但会受到 adjtime(3) 和 NTP 执行的增量调整的影响。
因此,在Linux下,最好的选择可能是CLOCK_MONOTONIC_RAW
。您可以使用@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)
}
延伸阅读:
- 围棋中单调时钟的讨论
- Outlook 在 go stdlib 中获取时钟接口