Go on Windows中的高分辨率计时器(毫秒精度)

时间:2016-06-08 15:28:25

标签: windows go timer

我正在尝试使用Go的time.Timer来安排需要以正确的顺序运行的任务,精度大约为半毫秒。这在OSX和Linux上运行得非常好,但每次都在Windows上失败。

以下代码演示了此问题。它设置5个定时器,第一个为1 ms,第二个为2 ms,......,最后一个为5 ms。计时器触发后,会打印其编号。在OSX和Linux上,这显然产生了“12345”作为输出,但在Windows上,数字或多或少随机(在Win 7和Windows Server 2012上测试)。

package main

import (
    "fmt"
    "time"
)

func main() {
    var timer1, timer2, timer3, timer4, timer5 *time.Timer

    timer1 = time.NewTimer(1 * time.Millisecond)
    timer2 = time.NewTimer(2 * time.Millisecond)
    timer3 = time.NewTimer(3 * time.Millisecond)
    timer4 = time.NewTimer(4 * time.Millisecond)
    timer5 = time.NewTimer(5 * time.Millisecond)

    // should print 12345
    for {
        select {
        case <-timer1.C:
            fmt.Print("1")
        case <-timer2.C:
            fmt.Print("2")
        case <-timer3.C:
            fmt.Print("3")
        case <-timer4.C:
            fmt.Print("4")
        case <-timer5.C:
            fmt.Print("5")
        case <-time.After(200 * time.Millisecond):
            return // exit the program
        }
    }
}

我认为这种行为是由于Go 1.6(https://golang.org/doc/go1.6#runtime,第4段)中所做的更改,其中Windows计时器精度从1毫秒减少到16毫秒,尽管它也应该以较短的间隔发生(之前为100μs)。

有没有办法将全局Windows计时器精度重置为1毫秒,或者访问高分辨率计时器以使上述示例有效?

1 个答案:

答案 0 :(得分:2)

自Go 1.7开始,定时器现在具有更高的分辨率,不应出现此问题。