这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
今天讲的是go的高质量编程与性能调优。将分为两个部分进行介绍。
高质量编程
高质量编程指的是代码能够达到安全可靠,简洁清晰的目标。 这里以注释、变量命名规范、控制流程为重点介绍。
- 注释要解释代码作用,如实现过程,以及提供额外上下文。
- 注释需要解释代码什么时候会出错
- 公共符号需要注释
- 变量缩略词全大写,函数名不携带包名的上下文信息。
- 控制流程避免嵌套。
- 尽量保持正常代码路径为最小缩进。
错误与异常处理
简单的错误指出现一次的错误,优先使用errors.New来创建匿名变量,如有格式化需求,使用fmt.Errorf
errors.New("err reason")
fmt.Errorf("err reason")
判定是否是特定错误,使用errors.Is。不建议使用panic在业务代码中。recover只能在defer函数中使用,嵌套无法生效。
性能优化建议
- slice,map预先分配内存
- 大内存未释放,使用copy会更好,因为在已有切片基础上创建切片,不会创建新的底层数组。原底层数组在内存中有引用,不会释放。
- 字符串的优化,使用strings.Builder
- 使用空结构体节省内存,作为占位符使用。
- atomic实现互斥操作,比锁效率高,sync.Mutex应该保护一段逻辑而不只是一个变量。
性能调优实战
原则:
- 要依靠数据
- 定位最大瓶颈
- 不要过早的过度的优化
pprof
采样过程与采样原理
CPU:
采样对象:函数调用和占用时间,采样率100一次,时间为手动启动到结束时间。操作系统没10ms发送一次SIGPROF信号,进程接收到后会记录调用堆栈,每100ms读取记录的调用栈并写入输入输出流。
性能优化案例
流程:
建立服务性能评估手段,分析性能数据和性能瓶颈,重点优化并进行优化验证。
- 手段
请求流量构造,压测范围选择,性能数据采集。
- 分析结果
库使用不规范,高并发场景优化不足。