这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
1.主要内容
- Go性能优化手段
- Go程序性能分析工具使用
- 简洁清晰的代码写法
- 性能优化流程
2.本节详细内容
编码规范
高质量的编码应正确,简洁清晰,可靠;需要考虑完备边界条件、异常以及易读易维护。
编程原则
- 简单性:简单清晰的逻辑,不理解的代码无法改进
- 可读性:人能看懂,维护代码第一步是可读
- 生产力:团队效率非常重要
编写规范
代码格式
- 推荐使用gofmt自动格式化代码
- goimports等于gofmt加上依赖包管理
注释
- 解释代码作用(例如公共符号)、代码如何做(实现过程)、实现的原因(外部因素以及上下文)以及什么情况会出错(限制条件)。
- 不明显也不简短的公共功能必须注释
- 库中任何函数无论简短和复杂程度都必须注释
命名规范
- 变量
- 简洁比长好
- 缩略应大写
- 变量距离使用地方越远,需要越多携带信息
- 函数
- 函数不带包名
- 尽量短
- 包
- 全由小写组成
- 简短并包含上下文信息
- 不能与标准库同名
流程
- 避免嵌套
- 保持正常代码路径为最小缩进
- 故障多在复杂条件语句和循环语句中
错误处理
- 简单错误使用errors.New匿名变量处理
- 判断特定错误使用errors.Is
- 特定种类使用errors.As
- 不建议使用panic
- recover只能在defer函数中使用,defer是后进先出
- recover后再log中记录调用栈
性能优化
- Benchmark工具测试
- 使用slice预分配内存,make初始化时提供容量信息
- 在已有切片上创建切片不会创建新的底层数组
- 不断向map添加元素会触发map扩容,提前分配好空间
- 字符串拼接使用strings.Builder和bytes.Buffer
- 使用空结构体节省内存
- 多线程使用atomic包
3.性能调优实战
调优原则
- 依赖数据
- 定位最大瓶颈
- 不要过早优化
- 不要过度优化
性能分析工具pprof
可视化和分析性能分析数据的工具
详见golang pprof 实战 | Wolfogre's Blog
火焰图是动态的,支持进行点击块分析
业务服务优化
- 建立服务性能评估手段
- 分析性能瓶颈
- 重点优化瓶颈
- 最后需要验证
- 优化的前提是正确性
- 压测不能保证和线上表现完全一致
4.课后总结
- pprof工具需要再看,熟练使用并且了解它的基本原理
- 性能调优需要数据支持
- 首要保证正确性,再进行性能调优
5.引用
字节内部课:高质量编程与性能调优实战