在 13.7 节 我们提到了在 Go 语言中对你的函数进行基准测试。在此我们将其应用到一个用协程向通道写入整数再读出的实例中。这个函数将通过 testing.Benchmark()
调用 N
次(例如:N = 1,000,000
),BenchMarkResult
有一个 String()
方法来输出其结果。N
的值将由 gotest
来判断并取得一个足够大的数字,以获得合理的基准测试结果。当然同样的基准测试方法也适用于普通函数。
如果你想排除指定部分的代码或者更具体的指定要测试的部分,可以使用 testing.B.startTimer()
和 testing.B.stopTimer()
来开始或结束计时器。基准测试只有在所有的测试通过后才能运行!
示例:14.18-benchmark_channels.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package main
import ( "fmt" "testing" )
func main() { fmt.Println(" sync", testing.Benchmark(BenchmarkChannelSync).String()) fmt.Println("buffered", testing.Benchmark(BenchmarkChannelBuffered).String()) }
func BenchmarkChannelSync(b *testing.B) { ch := make(chan int) go func() { for i := 0; i < b.N; i++ { ch <- i } close(ch) }() for range ch { } }
func BenchmarkChannelBuffered(b *testing.B) { ch := make(chan int, 128) go func() { for i := 0; i < b.N; i++ { ch <- i } close(ch) }() for range ch { } }
|
输出:
1 2 3 4
| Output:Windows: N Time 1 op Operations per sec sync 1000000 2443 ns/op --> 409 332 / s buffered 1000000 4850 ns/op --> 810 477 / s Linux:
|
链接