这是我参与「第五届青训营」笔记创作活动的第3天。
学习内容
今天学习了go语言如何进行高质量编程以及编码的性能调优,并学会使用pprof性能分析工具对编码进行性能优化。
高质量编程简介及编码规范
高质量编程
编写的代码正确可靠、简洁清晰。
编程原则
简单性;可读性;生产力。
编码规范
- 代码格式:使用gofmt自动格式化代码;使用goimports管理依赖包引用。
- 注释:解释代码作用;解释代码如何做的;解释代码实现的原因;解释代码什么情况下会出错。公共符号始终要注释。
- 命名规范:简洁清晰降低阅读代码成本;考虑上下文信息。
- 控制流程:避免嵌套,保证正常流程清晰;尽量保持正常代码路径为最小缩进。
- 错误和异常处理:
- 简单错误,errors.New;
- 错误的Wrap和Unwrap;
- 错误的判定,errors.Is\errors.As;
- panic,出现不可逆转的错误时可以使用;
- recover,在defer中使用,不能嵌套。
性能优化
- 基准性能测试工具:benchmark
go test -bench=, -benchmem; - slice预分配内存:尽可能在make时分配内存;
- map的预分配内存;
- 字符串操作使用strings.Builder,简单的使用+每次都会重新分配内存,而strings.Builder和bytes.Buffer底层都是[]byte数组,有内存扩容策略不必每次都重新分配;bytes.Buffer转化为字符串时重新申请了一块空间而strings.Builder直接将[]byte转换成了字符串返回。
- 空结构体:节省内存;用map实现Set;
- 使用atomic包:atomic操作通过硬件实现,而锁通过操作系统属于系统调用,效率高;sync的锁一般来维护一段逻辑;对于非数值操作,使用atomic.Value,可以承载一个interface。
性能优化实战
原则
- 要依靠数据而不是猜测;
- 要定位最大瓶颈而不是细枝末节;
- 不要过早优化;
- 不要过度优化。
性能分析工具——pprof
用于可视化和分析性能分析数据的工具。
功能:
性能调优:
- 保证正确性;
- 定位主要瓶颈。