性能优化 | 青训营笔记2
一、性能优化工具
1、Benchmark
1.1基本参数
- 2847081
b.N执行的次数 - 422.2ns/op
每次执行的时间 - 0B/op
每次执行时申请的内存容量 - 0 allocs/op
每次执行申请内存的次数
二、性能优化建议
1、slice
- slice:=make([]类型,长度,容量)
声明容量的大小,会大大减少代码执行时间(扩容操作耗费时间)
2、map
- map1:=make([键类型]值类型,容量)
预分配内存,减少在扩容过程中的内存拷贝以及rehash的消耗
三、性能分析工具pprof
1、pprof简介
- pprof是可视化的分析性能分析数据的工具
- pprof以 profile.proto 读取分析样本集合,最后将分析报告以可视化产出(支持文本和图形报告)
profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式
2、支持格式
- web interface:Web界面
- Report generation:报告生成
- Interactive terminal use:交互式终端使用
3、可以做什么
- CPU Profiling: cpu分析
- Memory Profiling: 内存分析
- Block Profiling: 阻塞分析
- Mutex Profiling: 互斥锁分析
4、简单实现pprof
4.1、引入pprof
- 导入 net/http/pprof 包 将以下代码添加到程序的导入部分:
import _ "net/http/pprof"
复制代码
- 在你的程序中添加一个pprof handler 在你的服务中添加以下代码,以在默认端口6060上启动
pprof:
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
复制代码
- 使用pprof(生成/profile和可视化数据) 构建你的程序并运行它,然后使用浏览器访问http://localhost:6060/debug/pprof/, 以查看pprof的可视化数据。
例如,
http://localhost:6060/debug/pprof/heap 提供了堆数据的可视化信息。 - 你还可以使用 go tool pprof 命令在命令行中生成和查看pprof数据。例如,要查看堆数据的pprof摘要,请运行以下命令:
go tool pprof http://localhost:6060/debug/pprof/heap
复制代码
在执行期间通过HTTP运行http://localhost:6060/debug/pprof/profile, 以生成CPU分析性能数据文件。记得在你的程序最后调用
pprof.StopCPUProfile()
复制代码
函数以停止采样。
4.2、pprof性能优化的步骤
- 使用go pprof命令运行你的程序并生成一个CPU
profile:
go tool pprof cpu.prof
复制代码
- 使用top命令查看CPU占用率前20的函数:
top20
复制代码
- 查看火焰图:
web
复制代码
通过火焰图和top命令查看有可能造成性能问题的函数。
- 使用调试技巧,尝试找到造成性能问题的原因,比如过度分配内存或者频繁的系统调用。
- 更改你的代码并使用pprof确认你的更改能提升程序的性能。
- 在使用pprof期间,请注意以下几点:
确保你的程序已经启用了 CPU profiling选项
(如 runtime.SetCPUProfileRate())
复制代码
- 在进行大型代码库的分析时,最好限制你的分析范围,以便更快地执行分析操作。
- 在pprof中有各种可定制的命令和选项,你可以通过运行help获得更多的帮助信息。
- 当性能问题被发现时,可以添加跟踪日志或指标以帮助你更好地理解问题并监视性能的改进。