在 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
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:
链接
- 目录
- 上一节:漏桶算法
- 下一节:使用通道并发访问对象
