如果代码使用了 Go 中 testing 包的基准测试功能,我们可以用 gotest 标准的 -cpuprofile 和 -memprofile 标志向指定文件写入 CPU 或 内存使用情况报告。
使用方式:go test -x -v -cpuprofile=prof.out -file x_test.go
编译执行 x_test.go 中的测试,并向 prof.out 文件中写入 cpu 性能分析信息。
13.10.3 用 pprof 调试
你可以在单机程序 progexec 中引入 runtime/pprof 包;这个包以 pprof 可视化工具需要的格式写入运行时报告数据。对于 CPU 性能分析来说你需要添加一些代码:
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")funcmain() { flag.Parse()if*cpuprofile !="" { f, err := os.Create(*cpuprofile)if err !=nil { log.Fatal(err) } pprof.StartCPUProfile(f)defer pprof.StopCPUProfile() }...
代码定义了一个名为 cpuprofile 的 flag,调用 Go flag 库来解析命令行 flag,如果命令行设置了 cpuprofile flag,则开始 CPU 性能分析并把结果重定向到那个文件。(os.Create 用拿到的名字创建了用来写入分析数据的文件)。这个分析程序最后需要在程序退出之前调用 StopCPUProfile 来刷新挂起的写操作到文件中;我们用 defer 来保证这一切会在 main 返回时触发。
现在用这个 flag 运行程序:progexec -cpuprofile=progexec.prof