在不受时钟变化影响的情况下对操作进行计时



我正在寻找:

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_gettimeCLOCK_REALTIME 一起使用。请参阅time·now实现。

你会想要一个单调的时钟(CLOCK_MONOTONICCLOCK_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 中获取时钟接口

相关内容

最新更新