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

25 阅读2分钟

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

1. 高质量编程

1.1 简介

编程原则

简单性 可读性 生产力

编程规范

代码格式 注释 命名规范 控制流程 错误和异常处理

  1. 注释应该做的:
  • 注释应该解释代码的作用
  • 注释应该解释代码是如何做的
  • 注释应该解释代码实现的原因
  • 注释应该解释代码什么情况会出错
  1. 控制流程:
  • 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
  • 正常流程代码沿着屏幕向下移动
  • 提升代码可维护性和可读性
  • 故障问题大多出现在复杂的条件语句和循环语句中
  1. 错误和异常处理
  • 简单的错误是仅出现一次的错误,且在其他地方不需要捕获该错误
  • 首先使用errors.New来创建匿名变量来直接表示简单错误

2. 性能调优

2.1 简介

  • 性能优化的前提是满足正确可靠,简洁清晰等质量因素
  • 性能优化是综合评估,有时候时间效率和空间效率可能对立
  • 针对Go语言特性,介绍Go相关的性能优化建议

2.2 性能优化建议Benchmark

Benchmark

  • 性能表现需要实际数据衡量
  • Go语言提供了支持基准性能测试的benchmark

Slide
slide预分配内存

  • 尽可能使用make()初始化切片时提供容量信息

另一个陷阱:大内存未释放

  • 在已有切片的基础上创建切片,不会创建新的底层数组 可使用copy代替re-slice

Map

  • 不断向map中添加元素的操作会触发map的扩容
  • 提前分配好空间可以减少内存拷贝和Rehash的消耗
  • 建议根据实际需求提前预估好需要的时间

字符串处理
使用string.Builder

  • 使用+拼接性能最差,string.Builder,byte.Buffer相近,string.Buffer更快

空结构体

  • 空结构体是struct{}实例不占据任何的内存空间
  • 可作为各种场景下的占位符使用,节省资源

atomic包

  • 锁的实现是通过操作系统来实现,属于系统调用
  • atomic操作是通过硬件实现,效率比锁高
  • sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
  • 对于非数值操作,可以使用atomic.Value,能承载一个interface{}