高质量编程与性能调优实战 | 青训营笔记

86 阅读3分钟

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

1.主要内容

  1. Go性能优化手段
  2. Go程序性能分析工具使用
  3. 简洁清晰的代码写法
  4. 性能优化流程

2.本节详细内容

编码规范

高质量的编码应正确,简洁清晰,可靠;需要考虑完备边界条件、异常以及易读易维护。

编程原则

  • 简单性:简单清晰的逻辑,不理解的代码无法改进
  • 可读性:人能看懂,维护代码第一步是可读
  • 生产力:团队效率非常重要

编写规范

代码格式

  • 推荐使用gofmt自动格式化代码
  • goimports等于gofmt加上依赖包管理

注释

  • 解释代码作用(例如公共符号)、代码如何做(实现过程)、实现的原因(外部因素以及上下文)以及什么情况会出错(限制条件)。
  • 不明显也不简短的公共功能必须注释
  • 库中任何函数无论简短和复杂程度都必须注释

命名规范

  • 变量
  1. 简洁比长好
  2. 缩略应大写
  3. 变量距离使用地方越远,需要越多携带信息
  • 函数
  1. 函数不带包名
  2. 尽量短
  1. 全由小写组成
  2. 简短并包含上下文信息
  3. 不能与标准库同名

流程

  • 避免嵌套
  • 保持正常代码路径为最小缩进
  • 故障多在复杂条件语句和循环语句中

错误处理

  • 简单错误使用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.引用

字节内部课:高质量编程与性能调优实战