准确测量围棋持续时间的正确方法是什么? 大多数应用程序只使用标准时间包和以下方法:

var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime

但是,time.Now()返回当前系统时间,这会导致两个缺陷:

  1. 如果系统时间在测量期间更改(例如,由于time zone change(DST)或leap second),结果持续时间也是错误的.
  2. 系统时间可以故意比实际时间快或慢.当操作系统将内部时钟与NTP时间服务器同步时,总是会发生这种情况(每小时可能会发生几次!)

    MSDN:

    [时间服务]调整本地时钟频率,以允许

如果系统时间更改(手动更改或由于DST更改),则可以检测到无效的持续时间并将其丢弃.但是,如果系统时钟以世界时间比同步快10%,那实际上是不可能检测到的.这是预期的行为,以及系统时钟是如何设计的.

因此,大多数其他语言都提供了一个专用的API来测量持续时间:

准确测量围棋执行时间的正确方法是什么?

推荐答案

Package time

单调时钟

操作系统既提供了"挂钟",也提供了 时钟同步的变化,以及"单调时钟",这是 不.一般的规则是挂钟是用来报时和报时的. 这个单调的钟是用来测量时间的.与其拆分API, 在此包中,由time返回的时间.现在包含两面墙 时钟读数和单调时钟读数;稍后报时 操作使用挂钟读数,但稍后计时 运算,特别是比较和减法,使用 单调的时钟读数.

例如,此代码始终计算 大约20毫秒,即使更改挂钟也是如此 在正在计时的操作期间:

start := time.Now()
... operation that takes 20 milliseconds ...
t := time.Now()
elapsed := t.Sub(start)

其他习语,如time.Since(开始)、time.Unl(截止日期)和 time.Now().Beast(Deadline),与墙上的时钟一样健壮 重置.

从Go 1.9(2017年8月24日发布)开始,Go使用一个单调的时钟表示持续时间.

Proposal: Monotonic Elapsed Time Measurements in Go.

Go相关问答推荐

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

禁用Golang中的终端

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

如何在Golang中获取mp3文件的持续时间?

如何在VSCode中为特定的.go文件创建调试配置?

如何使用中间件更改http请求的响应代码?

Golang SDK for DynamoDB:ReturnValuesOnConditionCheckFailure在条件chcek失败发生时不返回条件的详细信息

如何用';贪婪原则';正确地

如何确定泛型类型在运行时是否可比较?

无效操作:v > max(类型参数 T 与 > 不可比较)

xml.Unmarshal 不支持的类型 struct

linter 警告:返回值被忽略

类型/ struct 函数的 GoDoc 示例函数

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

没有任务角色的 AWS CDK ECS 任务定义

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

如何使用struct的方法清除除某些字段之外的struct值

Go 并发、goroutine 同步和关闭通道

Go:用于 XML 解码的嵌套 struct 中的提升字段

Golang LinkedList 删除第一个元素