portable - timer windows 10
Temporizadores de alta resoluciĆ³n(precisiĆ³n de milisegundos) en Go on Windows (1)
Estoy tratando de utilizar el tiempo de Go. El time.Timer
s para programar tareas que deben ejecutarse en el orden correcto con una precisión del orden de medio milisegundo. Esto funciona perfectamente bien en OSX y en Linux, pero falla siempre en Windows.
El siguiente código demuestra el problema. Establece 5 temporizadores, el primero a 1 ms, el segundo a 2 ms, ..., y el último a 5 ms. Una vez que un temporizador dispara, su número se imprime. En OSX y Linux, esto obviamente produjo "12345" como salida, pero en Windows los números son más o menos aleatorios (probados en Win 7 y 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
}
}
}
Creo que este comportamiento se debe a los cambios realizados en Go 1.6 ( https://golang.org/doc/go1.6#runtime , 4º párrafo), donde la precisión del temporizador de Windows se redujo de 1 ms a 16 ms, aunque también debería haber ocurrido con intervalos más cortos (del orden de 100 μs) antes.
¿Hay alguna forma de restablecer la precisión global del temporizador de Windows a 1 ms o acceder a un temporizador de alta resolución que haría que el ejemplo anterior funcione?
Desde Go 1.7, los temporizadores ahora tienen una resolución más alta y este problema no debería ocurrir.