这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天,通过学习记录并总结部分知识点,不足之处请指正。 本章知识点有以下方面:
性能优化
原则:
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
Go语言项目中的性能优化主要有以下几个方面:
- cpu profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据。
- memory profile:报告程序的内存使用情况
- block profilling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈
常见命令有:
- topN,查看占用资源最多的函数
- list函数名或者weblist函数名:
- web或者web函数名:函数被表示成不同的矩形(被调用越多,矩形越大),箭头指示函数调用链。
pprof与性能测试结合
go test命令有两个参数和 pprof 相关,它们分别指定生成的 CPU 和 Memory profiling 保存的文件:
- -cpuprofile:cpu profiling 数据要保存的文件地址
- -memprofile:memory profiling 数据要保存的文件地址
我们还可以选择将pprof与性能测试相结合,比如:
比如下面执行测试的同时,也会执行 CPUprofiling,并把结果保存在 cpu.prof 文件中:
go test -bench . -cpuprofile=cpu.prof
比如下面执行测试的同时,也会执行 Memprofiling,并把结果保存在 cpu.prof 文件中:
go test -bench . -memprofile=./mem.prof
需要注意的是,Profiling 一般和性能测试一起使用,这个原因在前文也提到过,只有应用在负载高的情况下 Profiling 才有意义。
总结:不同的语言对于性能处理有着不同的方式,要想对于一门语言熟练掌握,就要对其的各个方面处理的熟练,从一个小部分开始,逐步学习,逐步掌握,当熟悉之后,在自己真正需要使用的时候,才能快速选择正确的方式去处理。