114 lines
2.2 KiB
Go
114 lines
2.2 KiB
Go
|
## 一 基准测试
|
|||
|
|
|||
|
> 基准测试:用于测试一段程序的运行性能及CPU消耗
|
|||
|
|
|||
|
性能测试函数以 Benchmark 为名称前缀,同样保存在 `*_test.go` 文件里。
|
|||
|
|
|||
|
示例:
|
|||
|
```go
|
|||
|
func Benchmark_Hello(b *testing.B){
|
|||
|
|
|||
|
// 开始测试性能相关代码
|
|||
|
b.ResetTimer()
|
|||
|
for i := 0; i < b.N; i++ {
|
|||
|
// 测试代码
|
|||
|
}
|
|||
|
|
|||
|
// 结束性能测试
|
|||
|
b.StopTimer()
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
测试:
|
|||
|
```
|
|||
|
go test -v -bench=Hello # -bench=.表示运行所有基准测试。win下参数为:-bench="-"
|
|||
|
```
|
|||
|
|
|||
|
常用参数:
|
|||
|
```
|
|||
|
-benchmem # 显示性能具体的开销情况
|
|||
|
-benchtime=5s # 自定义测试时间为5秒
|
|||
|
```
|
|||
|
|
|||
|
## 二 性能监控
|
|||
|
|
|||
|
利用go的 `runtime/pprof` 包可以生成prof文件,用来查看go代码的运行情况,示例代码:
|
|||
|
```go
|
|||
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"os"
|
|||
|
"runtime/pprof"
|
|||
|
)
|
|||
|
|
|||
|
func slowFunc(){
|
|||
|
|
|||
|
str := "hello world "
|
|||
|
for i := 0; i < 5; i++ {
|
|||
|
str += str
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func main() {
|
|||
|
|
|||
|
// 创建输出文件
|
|||
|
f, err := os.Create("cpu.prof")
|
|||
|
if err != nil {
|
|||
|
fmt.Println("create cpu.prof err :", err)
|
|||
|
return
|
|||
|
}
|
|||
|
// 获取系统信息
|
|||
|
if err := pprof.StartCPUProfile(f); err != nil {
|
|||
|
fmt.Println("start cpu.prof err :", err)
|
|||
|
return
|
|||
|
}
|
|||
|
defer pprof.StopCPUProfile()
|
|||
|
|
|||
|
// 业务代码
|
|||
|
slowFunc()
|
|||
|
|
|||
|
// 获取内存相关信息
|
|||
|
f1, err := os.Create("mem.prof")
|
|||
|
defer f1.Close()
|
|||
|
if err != nil {
|
|||
|
fmt.Println("create mem.prof err :", err)
|
|||
|
return
|
|||
|
}
|
|||
|
// runtime.GC() // 是否获取最新的数据信息
|
|||
|
if err := pprof.WriteHeapProfile(f1); err != nil {
|
|||
|
fmt.Println("write cpu.prof err :", err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// 获取协程相关信息
|
|||
|
f2, err := os.Create("goroutine.prof")
|
|||
|
defer f2.Close()
|
|||
|
if err != nil {
|
|||
|
fmt.Println("create goroutine.prof err :", err)
|
|||
|
return
|
|||
|
}
|
|||
|
if gProf := pprof.Lookup("goroutine"); gProf != nil {
|
|||
|
fmt.Println("write goroutine.prof err :", err)
|
|||
|
return
|
|||
|
} else {
|
|||
|
gProf.WriteTo(f2, 0)
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
生成prof文件:
|
|||
|
```
|
|||
|
# 生成程序的二进制文件
|
|||
|
go build -o program main.go // 此时会按照代码中的要求生成多份prof文件
|
|||
|
|
|||
|
# 查看prof文件
|
|||
|
go tool pprof program cpu.prof
|
|||
|
```
|
|||
|
|
|||
|
贴士:
|
|||
|
- 导入 `"_ "net/http/pprof"`包还可以实现以网页形式展示prof文件内容!
|
|||
|
- 程序执行前加上环境变量可以查看GC日志,如:`GODEBUG=gctrace=1 go run main.go`
|