🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 ``` Benchmark_Division-4 ``` ### 参数 ``` -bench 指定为压测 -bench=. 执行所有压测 -bench='^BenchmarkFoo$'用正则指定类型 ``` ``` -cpu: 设置逻辑 CPU 的最大个数,多个用逗号隔开,如:-cpu=2 -cpu=2,4 -benchtime: 设置执行时间为5s,默认1s,如 -benchtime=5s -benchmem: 提供每次操作分配内存的次数,以及每次操作分配的字节数,如: -benchmem -count: 设置压测执行次数 -count=5 -cpuprofile: 生成profile 文件,用于性能追踪, -cpuprofile=cpu.profile -memprofil: 输出 heap 的 pprof 信息文件。-memprofile mem.prof -blockprofile 阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置 -block.prof -mutexprofile 互斥锁分析,报告互斥锁的竞争情况 -mutexprofile=mutex.prof ``` ## 实例 ### hello world <details> <summary>gotest.go</summary> ``` package main import "errors" func Division(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("除数不能为0") } return a / b, nil } ``` </details> <br/> <details> <summary>gotest_bench_test.go</summary> ``` package main import "testing" func Benchmark_Division(b *testing.B) { for i := 0; i < b.N; i++ { //use b.N for looping Division(4, 5) } } ``` </details> <br/> ``` > go test -bench=Division 或 go test -bench=Benchmark_Division goos: windows goarch: amd64 pkg: bigant/test Benchmark_Division Benchmark_Division-4 1000000000 0.321 ns/op PASS ok bigant/test 0.558s ``` ### `Benchmark_xx-4` 含义 这里的-4中的4 表示最大 P 数量,最大 P 数量相当于可以同时运行 goroutine 的逻辑 CPU 的最大个数。不是实际cpu数目. 对应 golang 就是 GOMAXPROCS 的值。这个你可以自行设置,可以通过调用 runtime.GOMAXPROCS 函数改变最大P数量,也可以在命令行 go test 加入 -cpu=2 ### 重新设置压测开始时间,用于压测前准备 ``` func Benchmark_TimeConsumingFunction(b *testing.B) { b.StopTimer() //调用该函数停止压力测试的时间计数 //初始化工作 b.StartTimer() //重新开始时间 for i := 0; i < b.N; i++ { Division(4, 5) } } ``` ### 压测数据进行 pprof 生成可执行文件和 cpu.profile 文件 ``` go test -bench=. -cpuprofile=cpu.profile -bench=. "."为批量压测,也可指定名称,参考普通压测 ``` 读取 cpu.profile 文件 `go tool pprof test.test.exe cpu.profile`