在 §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 mainimport ("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 secsync 1000000 2443 ns/op --> 409 332 / sbuffered 1000000 4850 ns/op --> 810 477 / sLinux:
*/
