menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 14.16.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    14.16.md
    1.76 KB / 2024-07-16 23:14:28
        # 14.16 对 Go 协程进行基准测试
    
    在 [13.7 节](13.7.md) 我们提到了在 Go 语言中对你的函数进行基准测试。在此我们将其应用到一个用协程向通道写入整数再读出的实例中。这个函数将通过 `testing.Benchmark()` 调用 `N` 次(例如:`N = 1,000,000`),`BenchMarkResult` 有一个 `String()` 方法来输出其结果。`N` 的值将由 `gotest` 来判断并取得一个足够大的数字,以获得合理的基准测试结果。当然同样的基准测试方法也适用于普通函数。
    
    如果你想排除指定部分的代码或者更具体的指定要测试的部分,可以使用 `testing.B.startTimer()` 和 `testing.B.stopTimer()` 来开始或结束计时器。基准测试只有在所有的测试通过后才能运行! 
    
    示例:14.18-[benchmark_channels.go](examples/chapter_14/benchmark_channels.go)
    
    ```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 {
    	}
    }
    ```
    
    输出:
    
    ```
      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:
    ```
    
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[漏桶算法](14.15.md)
    - 下一节:[使用通道并发访问对象](14.17.md)
    
    
    links
    file_download