准确测量围棋持续时间的正确方法是什么? 大多数应用程序只使用标准时间包和以下方法:
var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime
但是,time.Now()
返回当前系统时间,这会导致两个缺陷:
- 如果系统时间在测量期间更改(例如,由于time zone change(DST)或leap second),结果持续时间也是错误的.
-
系统时间可以故意比实际时间快或慢.当操作系统将内部时钟与NTP时间服务器同步时,总是会发生这种情况(每小时可能会发生几次!)
从MSDN:
[时间服务]调整本地时钟频率,以允许
如果系统时间更改(手动更改或由于DST更改),则可以检测到无效的持续时间并将其丢弃.但是,如果系统时钟以世界时间比同步快10%,那实际上是不可能检测到的.这是预期的行为,以及系统时钟是如何设计的.
因此,大多数其他语言都提供了一个专用的API来测量持续时间:
- Java有
System.nanoTime()
,System.currentTimeMillis()
等于time.Now()
,这是错误的 - C#有
System.Diagnostics.Stopwatch
个 - Windows上的C/C++有
QueryPerformanceCounter
和QueryPerformanceFrequency
- C++11及更高版本在其
is_steady
成员常量为true
时为std::chrono::steady_clock
或std::chrono::high_resolution_clock
- JavaScript有
performance.now()
个,而使用new Date()
是错误的
准确测量围棋执行时间的正确方法是什么?