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

50 阅读2分钟

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

学习内容

今天学习了go语言如何进行高质量编程以及编码的性能调优,并学会使用pprof性能分析工具对编码进行性能优化。

高质量编程简介及编码规范

高质量编程

编写的代码正确可靠、简洁清晰。

编程原则

简单性;可读性;生产力。

编码规范

  1. 代码格式:使用gofmt自动格式化代码;使用goimports管理依赖包引用。
  2. 注释:解释代码作用;解释代码如何做的;解释代码实现的原因;解释代码什么情况下会出错。公共符号始终要注释。
  3. 命名规范:简洁清晰降低阅读代码成本;考虑上下文信息。
  4. 控制流程:避免嵌套,保证正常流程清晰;尽量保持正常代码路径为最小缩进。
  5. 错误和异常处理:
  • 简单错误,errors.New;
  • 错误的Wrap和Unwrap;
  • 错误的判定,errors.Is\errors.As;
  • panic,出现不可逆转的错误时可以使用;
  • recover,在defer中使用,不能嵌套。

性能优化

  • 基准性能测试工具:benchmarkgo 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

用于可视化和分析性能分析数据的工具。
功能:

捕获.PNG

性能调优:

  • 保证正确性;
  • 定位主要瓶颈。