这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习Go语言性能调优时进行的简单记录。
一、本堂课的重点内容
- 如何实现高质量的Go语言编程
- 了解常用的Go语言优化手段
- 熟悉Go语言性能分析工具
- 了解工程中性能优化的原则和流程
二、详细知识点介绍
高质量编程
什么是高质量?指的是——编写的代码能够达到正确可靠、简洁清晰的目标,称之为高质量代码。
主要需要考虑边界条件、异常处理和易读易维护性。
要实现高质量编程主要需要注意的内容有:代码格式、注释、命名规范、控制流程以及错误和异常处理。其实不仅是Go语言开发,其他工程实践中都需要注意这些编程的规范问题,好的规范可以提升团队之间的沟通流畅性,也可以更好地提高工作效率。
性能优化指南
我们可以使用Benchmark。这是go自带的基本的性能分析工具,这部分内容其实在上节课单元测试部分也提到过。
在编程过程中,常有的性能优化手段如下:
- 对于切片slice,尽量预分配内存;在已有切片的基础上创建切片,尽量使用copy
- 对于map,也是可以提前分配好内存
- 对于字符串处理,其实类似于java,go里面也是最好不要使用直接拼接的方法,而是使用strings.Builder或者strings.Buffer
- 在实际开发过程中,可以使用空结构体来代表占位符
- 使用atomic包来进行原子操作,由于atomic是通过硬件来实现的,所以效率比锁高,sync.Mutex应该用来保护一段逻辑而非一个变量
Go语言性能分析工具
这一部分内容将在下面的实践部分展开说明
业务服务优化流程
整体的优化流程相当合理:
- 建立服务性能评估手段
- 分析性能数据,定位瓶颈
- 重点优化项改造
- 优化效果验证
三、实践练习例子
直接在github上拷贝实验代码,运行,随后在浏览器输入localhost:6060/debug/pprof进入下图界面,可以点击相应的部分查看指标
可以看到一些json格式的内容,如下图是heap堆的指标
显然此时页面上的内容并不容易分析,此时我们可以打开命令行输入以下代码
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
如下图所示,进入pprof模式,接下来可以查看各项指标的详细内容了。
在命令行中,我们可以输入以下若干种命令进行性能分析:
- topN:查看占用资源最多的函数
- list:根据指定的正则表达式查找代码行
- web:调用关系可视化
在通过分析工具定位到相应的位置之后,调整代码,之后再次运行pprof工具,输入top,我们会发现结果已经改变了,性能优化成功!
此外,我们还可以使用以下命令进行协程的排查:
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
输入完成之后,会跳出来如下页面,这里一开始我没有安装graphviz,因此跳出失败了,安装一下重新命令行输入代码即可。
使用这个工具即可进行协程排查。
四、课后个人总结
主要了解了Go语言的编程规范,性能优化的基础流程,并且通过实际动手操作,体验了pprof优化的过程,为以后在项目中进行项目调优打下了基础。