在 §13.7 章节,我们提到了 Go 函数中的性能基准测试原则。 在此我们将它应用于一个具体的范例之中:使用一个 goroutine 填充整数,然后再读取。测试中函数将被调用 N 次 (e.g. N = 1000000) 。基准测试中, BenchMarkResult 有一个 String () 方法用于输出结果。数值 N 由 gotest 决定,该值只有足够大才能判断出基准测试结果可靠合理。
基准测试同样适用于普通函数。
如果想排除一部分代码或者更具体的测算时间,你可以适当使用 testing.B.StopTimer()
和 testing.B.StartTimer()
来关闭或者启动计时器。只有所有测试全部通过,基准测试才会运行。
清单 14.18—benchmark_channels.go:
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 {
}
}
/* 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:
*/