在 §13.7 章节,我们提到了 Go 函数中的性能基准测试原则。 在此我们将它应用于一个具体的范例之中:使用一个 goroutine 填充整数,然后再读取。测试中函数将被调用 N 次 (e.g. N = 1000000) 。基准测试中, BenchMarkResult 有一个 String () 方法用于输出结果。数值 N 由 gotest 决定,该值只有足够大才能判断出基准测试结果可靠合理。

    基准测试同样适用于普通函数。

    如果想排除一部分代码或者更具体的测算时间,你可以适当使用 testing.B.StopTimer()testing.B.StartTimer() 来关闭或者启动计时器。只有所有测试全部通过,基准测试才会运行。

    清单 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. }

    /* Output:

    1. 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:

    */