高质量编程与性能调优 | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
课程内容概要如下:
一、高质量编程 1.简介 何谓高质量? 编写的代码能够达到正确可靠、简洁清晰的目标可称为高质量代码。
高质量代码编程原则:
简单性
可读性
生产力
2.编码规范内容:
①代码格式
主要有下面两种工具进行格式化代码:推荐使用gofmt
[1]gofmt--能自动格式化Go语言代码为官方统一风格
Goland配置gofmt方法如下:
(1)setting--->Tools--->File Watcher
(2)点击+号,选择go fmt,按下图修改红色框内的值:将go fmt改为gofmt,在参数项添加-l -w -s
[2]goimports--也是Go语言官方提供的工具
实际等于gofmt加上依赖包管理,可以自动增删依赖的包引用、将依赖包按字母序排序并分类
②注释
代码是最好的注释,注释应该能够提供上下文未表达出的上下文信息
作用如下:
[1]解释代码作用:注释公共符号
[2]解释代码是如何做的:注释实现过程
[3]解释代码实现的原因:解释代码的外部因素,提供额外上下文
[4]解释代码什么情况会出错:解释代码的限制条件
[5]公共符号始终要注释
③命名规范
[1]变量
(1)缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写。
如使用SeverHTTP而不是ServerHttp
使用XMLHTTPRequest或者xmlHTTPRequest
变量距离其被使用的地方越远,则需要携带越多的上下文信息。
[2]函数
函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
函数名尽量简短
[3]包名
④控制流程
[1]避免嵌套,保持正常流程清晰
[2]进来保持正常代码路径为最小缩进
⑤错误和异常处理
[1]简单错误
[2]错误的Wrap和Unwrap
[3]错误判定
[4]panic
[5]recover
3.性能优化建议
①简介
②优化建议如下
[1]使用Benchmark,Go语言提供了支持基准性能测试的benchmark工具
go test -bench=. -benchmem
[2]使用Slice预分配内存,尽可能在使用make()初始化切片时提供容量信息。
[3]Slice使用copy替代re-slice来减少内存占用,节省内存空间
[4]map预分配内存
[5]使用strings.Builder处理字符串
[6]使用空结构体节省内存
[7]automic包
二、性能调优实战
1.性能调优简介
①性能调优原则
2.性能分析工具pprof实战
pprof是用于可视化和分析性能分析数据的工具。
①pprof功能简介
项目代码地址:github.com/wolfogre/go…
运行代码--->浏览器查看指标:localhost:6060/debug/pprof/
-->主要分析allocs、block、heap、mutex、profile
--->可在任务管理器界面查看CPU情况
--->可以通过如下命令采集性能数据:go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10 (结果如下图1)
--->再输入top(结果如下图2)
-->输入list Eat看这个函数具体是哪里出问题(见图3)
--->输入web命令使得调用关系可视化
注:如果出现Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%
这是因为电脑没有安装gvedit导致的 --->注释掉有问题的代码 再看看CPU情况
--->内存情况查询:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
--->把问题代码注释掉,看内存使用情况 注:指标说明见图4
--->goroutine协程情况:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
火焰图的介绍: 由上到下表示调用顺序 每一块代表一个函数,越长代表占用CPU的时间越长 火焰图是动态的,支持点击块进行分析
--->mutex 锁的查看:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
--->block 阻塞的查看 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
图1:
图2:
什么情况下Flat == Cum,什么情况下Flat == 0
Flat == Cum,函数中没有调用其他函数
Flat == 0,函数中只有其他函数的调用
图3:
图4:
小结:
3.性能调优案例
①业务服务优化
②Go语言优化