実行環境に依ると思いますが、今回の結果としては、1ms間隔のTickを要求して、平均1023us、標準偏差232usでした。思った以上に精度が悪かったです。
この結果が、golangのタイマーの実装に依るものなのか、OSのタイマーの精度に依るものなのか、までは調べていません。実行環境がLinuxだったので、後者の影響が大きいと思います。
使用した環境
Xubuntu 12.04go1.3
テストコード
以下のコードtime_precision.goは、1ms間隔のTickを1000回取得して、その平均値を計算しています。package main
import (
"fmt"
"sync"
"time"
)
const numof_sample = 1000
const interval_millisec = 1
func main() {
times := make([]time.Time, numof_sample)
tick := time.Tick(interval_millisec * time.Millisecond)
var wg sync.WaitGroup
wg.Add(1)
go func() {
for i := 0; i < len(times); i++ {
times[i] = <-tick
}
wg.Done()
}()
wg.Wait()
ave := int64(0)
for i := 1; i < len(times); i++ {
diff := times[i].UnixNano() - times[i-1].UnixNano()
ave += diff
fmt.Printf("tick interval: %6d [us]\n", diff/1000)
}
ave /= int64(len(times) - 1)
fmt.Printf("ave: %6d [us]\n", ave/1000)
}
実行結果
$ go run time_precision.go tick interval: 964 [us] tick interval: 1002 [us] tick interval: 1004 [us] tick interval: 974 [us] tick interval: 971 [us] tick interval: 1023 [us] tick interval: 1024 [us] tick interval: 1025 [us] (中略) tick interval: 1374 [us] tick interval: 509 [us] tick interval: 1480 [us] tick interval: 540 [us] tick interval: 1684 [us] tick interval: 337 [us] tick interval: 929 [us] ave: 1023 [us]
平均は、1023usでした。
別途標準偏差を計算すると、標準偏差は232usでした。
msオーダではtime.Tick()の精度はあまり期待できないようです。
参考
http://stackoverflow.com/questions/14610459/how-precise-is-gos-time-reallyhttp://d.hatena.ne.jp/naoya/20080122/1200960926
0 件のコメント:
コメントを投稿