2016-06-08 49 views
5

Sto provando a utilizzare i numeri time.Timer di Go per pianificare le attività che devono essere eseguite nell'ordine corretto con una precisione dell'ordine di mezzo millisecondo. Funziona perfettamente su OSX e su Linux, ma fallisce sempre su Windows.Timer ad alta risoluzione (precisione millisecondo) in Go on Windows

Il seguente codice illustra il problema. Imposta 5 timer, il primo a 1 ms, il secondo a 2 ms, ... e l'ultimo a 5 ms. Quando scatta un timer, viene stampato il suo numero. Su OSX e Linux, questo ovviamente ha prodotto "12345" come output, ma su Windows i numeri sono più o meno casuali (testati su Win 7 e 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 
     } 
    } 
} 

Penso che questo comportamento è dovuto alle modifiche apportate in Go 1.6 (https://golang.org/doc/go1.6#runtime, 4 ° comma), dove la precisione del timer di Windows è stato ridotto da 1 ms a 16 ms, anche se dovrebbe anche essersi verificato con intervalli più brevi (dell'ordine di 100 μs) prima.

Esiste un modo per reimpostare la precisione globale del timer di Windows su 1 ms o per accedere a un timer ad alta risoluzione che renderebbe funzionante l'esempio precedente?

+3

Qual è il comportamento corrente in go1.7rc? Ci sono state più modifiche ai timer di Windows a causa delle loro prestazioni. Si consiglia di leggere i numerosi problemi relativi al timer di Windows in GH. – JimB

+0

I timer sembrano avere una risoluzione maggiore con la versione beta corrente di Go 1.7. Grazie per l'aiuto. – m4r73n

+1

Probabilmente è una buona idea aggiungerla come risposta e contrassegnarla come accettata se ne sei felice. Quindi le persone che cercano di rispondere a domande senza risposta possono saltare questo. – ijt

risposta

0

Da Go 1.7, i timer ora hanno una risoluzione più elevata e questo problema non dovrebbe verificarsi.