-bench 压测
最后更新于:2022-04-02 02:51:39
[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
``` > 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`
';
gotest.go
``` package main import "errors" func Division(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("除数不能为0") } return a / b, nil } ```gotest_bench_test.go
``` 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) } } `````` > 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`