这是我参与「第五届青训营 」伴学笔记创作活动的第5天
一、重点内容:
-
本次主要对高质量编程中的性能优化和pprof性能分析工具进行学习。
- 性能优化主要是通过工具对程序进行性能测试后,寻找性能瓶颈进行优化。
- pprof是go中常用的性能分析工具,功能强大且易用。
二、详细知识点介绍:
- 性能优化建议
- Go中自带Benchmark标志,可以通过-bench参数实现基础的程序性能测试,在上篇文章中也有介绍,具体实践参见第三部分。
- 针对slice和map的数据结构,初始化提供容量信息能极大地提升系统性能。通过预分配内存的方式可以减少重分配内存的速度,提升程序运行效率。
- 注意slice如果在已有切片的基础上创建切片,不会对原切片进行释放,可以通过copy替代re-slice减少内存的占用。
- 针对字符串要尽量避免+拼接,该方式每次都会重新申请内存来存储拼接结果。可以采用string.Builder或bytes.Buffer替代实现性能优化。
- 空结构体在Go中不占据任何内存空间,可以作为占位符来使用。
- 在多线程编程中,如果有计数等方面的需求,可以使用atomic包替代mutex。atomic是通过硬件实现的,比系统调用的效率高很多。锁应该用来保护一段逻辑,不仅用于保护一个变量。
- pprof
- pprof是一个可以用于可视化和分析性能的分析数据工具。可以方便地帮助开发者确定在哪些地方耗费了多少CPU、内存、阻塞、协程等。
- 命令topN可以查看占用资源最多地函数。
- 命令list可以根据指定地正则表达式查找代码行。
- 命令web可以实现调用关系的可视化。
- 最常用的还是go tool pprof -http=:xxxx "http://localhost:6060/debug/pprof/xxx" 实现网页端的性能分析和排查。有top、火焰图、调用图、源码等查看方式。
- pprof的原理可以参考博客golang pprof 实战 | Wolfogre's Blog
三、实践练习例子:
- 实现Benchmark的测试代码如下:
func BenchmarkRandInt(b *testing.B) {
for i := 0; i < b.N; i++ {
rand.Int()
}
}
-
运行结果如图所示:
-
pprof实践例子代码已在上一篇文章中贴出,参考网站为github.com/wolfogre/go…
-
通过浏览器查看如图:
四、个人总结与体会:
- 性能优化是我之前一直没有接触过的一个领域,通过本节课的学习我了解了正常业务服务优化的流程,更多的还是一种认知上的提升,后续调试优化代码的时候带着这些思维肯定能事半功倍。
- 不过陌生的领域总是需要更多的时间去消化,很多内容初学者只能浮于表面,要想技术有所提升还是得课后了解原理并自己动手实践才能有更深刻的体会。