Go编码规范与性能调优 | 青训营笔记

74 阅读2分钟

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

今天讲的是go的高质量编程与性能调优。将分为两个部分进行介绍。

高质量编程

高质量编程指的是代码能够达到安全可靠,简洁清晰的目标。 这里以注释、变量命名规范、控制流程为重点介绍。

  1. 注释要解释代码作用,如实现过程,以及提供额外上下文。
  2. 注释需要解释代码什么时候会出错
  3. 公共符号需要注释
  4. 变量缩略词全大写,函数名不携带包名的上下文信息。
  5. 控制流程避免嵌套。
  6. 尽量保持正常代码路径为最小缩进。

错误与异常处理

简单的错误指出现一次的错误,优先使用errors.New来创建匿名变量,如有格式化需求,使用fmt.Errorf

errors.New("err reason")
fmt.Errorf("err reason")

判定是否是特定错误,使用errors.Is。不建议使用panic在业务代码中。recover只能在defer函数中使用,嵌套无法生效。

性能优化建议

  1. slice,map预先分配内存
  2. 大内存未释放,使用copy会更好,因为在已有切片基础上创建切片,不会创建新的底层数组。原底层数组在内存中有引用,不会释放。
  3. 字符串的优化,使用strings.Builder
  4. 使用空结构体节省内存,作为占位符使用。
  5. atomic实现互斥操作,比锁效率高,sync.Mutex应该保护一段逻辑而不只是一个变量。

性能调优实战

原则:

  1. 要依靠数据
  2. 定位最大瓶颈
  3. 不要过早的过度的优化

pprof

采样过程与采样原理

CPU:

采样对象:函数调用和占用时间,采样率100一次,时间为手动启动到结束时间。操作系统没10ms发送一次SIGPROF信号,进程接收到后会记录调用堆栈,每100ms读取记录的调用栈并写入输入输出流。

性能优化案例

流程:

建立服务性能评估手段,分析性能数据和性能瓶颈,重点优化并进行优化验证。

  1. 手段

请求流量构造,压测范围选择,性能数据采集。

  1. 分析结果

库使用不规范,高并发场景优化不足。