# 14.16 对Go协程进行基准测试

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 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
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

输出:

  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:
1
2
3
4

# 链接