如何使更好的超时功能

时间:2014-03-08 07:21:45

标签: go timeout raft

我正在使用time.After(time),这是正常的。

我的问题是:它是否准确,我应该使用它还是应该自己动手?我正在使用Raft Consensus算法实现。

1 个答案:

答案 0 :(得分:4)

我认为你的意思是time.After

我写了一个快速基准来回答这个问题。

使用go test -run XXX -bench . time_after_test.go

运行
package main

import (
    "testing"
    "time"
)

func BenchmarkTimeAfterSecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Second)
    }
}

func BenchmarkTimeAfterMillisecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Millisecond)
    }
}

func BenchmarkTimeAfterMicrosecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Microsecond)
    }
}

func BenchmarkTimeAfterNanosecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Nanosecond)
    }
}

这在linux amd64机器上的go1.2下了

BenchmarkTimeAfterSecond                   1    1000132210 ns/op
BenchmarkTimeAfterMillisecond           2000       1106763 ns/op
BenchmarkTimeAfterMicrosecond          50000         62649 ns/op
BenchmarkTimeAfterNanosecond         5000000           493 ns/op

所以答案在我的机器上精确到0.1-0.2 mS左右。

这非常依赖操作系统和硬件,但是在您选择的操作系统和硬件方面会有所不同。