## 一 基准测试 > 基准测试:用于测试一段程序的运行性能及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`