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

  1. package main
  2. import (
  3. "fmt"
  4. "testing"
  5. )
  6. func main() {
  7. fmt.Println(" sync", testing.Benchmark(BenchmarkChannelSync).String())
  8. fmt.Println("buffered", testing.Benchmark(BenchmarkChannelBuffered).String())
  9. }
  10. func BenchmarkChannelSync(b *testing.B) {
  11. ch := make(chan int)
  12. go func() {
  13. for i := 0; i < b.N; i++ {
  14. ch <- i
  15. }
  16. close(ch)
  17. }()
  18. for range ch {
  19. }
  20. }
  21. func BenchmarkChannelBuffered(b *testing.B) {
  22. ch := make(chan int, 128)
  23. go func() {
  24. for i := 0; i < b.N; i++ {
  25. ch <- i
  26. }
  27. close(ch)
  28. }()
  29. for range ch {
  30. }
  31. }

输出:

  1. Output:Windows: N Time 1 op Operations per sec
  2. sync 1000000 2443 ns/op --> 409 332 / s
  3. buffered 1000000 4850 ns/op --> 810 477 / s
  4. Linux:

链接