初始Go语言(3)——Go语言性能优化指南| 青训营笔记

57 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习Go语言性能调优时进行的简单记录。

一、本堂课的重点内容

  1. 如何实现高质量的Go语言编程
  2. 了解常用的Go语言优化手段
  3. 熟悉Go语言性能分析工具
  4. 了解工程中性能优化的原则和流程

二、详细知识点介绍

高质量编程

什么是高质量?指的是——编写的代码能够达到正确可靠、简洁清晰的目标,称之为高质量代码。

主要需要考虑边界条件、异常处理和易读易维护性。

要实现高质量编程主要需要注意的内容有:代码格式、注释、命名规范、控制流程以及错误和异常处理。其实不仅是Go语言开发,其他工程实践中都需要注意这些编程的规范问题,好的规范可以提升团队之间的沟通流畅性,也可以更好地提高工作效率。

性能优化指南

我们可以使用Benchmark。这是go自带的基本的性能分析工具,这部分内容其实在上节课单元测试部分也提到过。

在编程过程中,常有的性能优化手段如下:

  1. 对于切片slice,尽量预分配内存;在已有切片的基础上创建切片,尽量使用copy
  2. 对于map,也是可以提前分配好内存
  3. 对于字符串处理,其实类似于java,go里面也是最好不要使用直接拼接的方法,而是使用strings.Builder或者strings.Buffer
  4. 在实际开发过程中,可以使用空结构体来代表占位符
  5. 使用atomic包来进行原子操作,由于atomic是通过硬件来实现的,所以效率比锁高,sync.Mutex应该用来保护一段逻辑而非一个变量

Go语言性能分析工具

这一部分内容将在下面的实践部分展开说明

业务服务优化流程

整体的优化流程相当合理:

  1. 建立服务性能评估手段
  2. 分析性能数据,定位瓶颈
  3. 重点优化项改造
  4. 优化效果验证

三、实践练习例子

直接在github上拷贝实验代码,运行,随后在浏览器输入localhost:6060/debug/pprof进入下图界面,可以点击相应的部分查看指标

image.png

可以看到一些json格式的内容,如下图是heap堆的指标

image.png

显然此时页面上的内容并不容易分析,此时我们可以打开命令行输入以下代码

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

如下图所示,进入pprof模式,接下来可以查看各项指标的详细内容了。

image.png

image.png

在命令行中,我们可以输入以下若干种命令进行性能分析:

  1. topN:查看占用资源最多的函数
  2. list:根据指定的正则表达式查找代码行
  3. web:调用关系可视化

在通过分析工具定位到相应的位置之后,调整代码,之后再次运行pprof工具,输入top,我们会发现结果已经改变了,性能优化成功!

image.png

此外,我们还可以使用以下命令进行协程的排查:

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

输入完成之后,会跳出来如下页面,这里一开始我没有安装graphviz,因此跳出失败了,安装一下重新命令行输入代码即可。

image.png

使用这个工具即可进行协程排查。

四、课后个人总结

主要了解了Go语言的编程规范,性能优化的基础流程,并且通过实际动手操作,体验了pprof优化的过程,为以后在项目中进行项目调优打下了基础。