GO-010 高质量代码与性能优化

39 阅读2分钟

1、高质量代码规范

编程原则:简单性,可读性,生产力

注释:公共符号始终要注释,应该提供代码上下文未表达出的信息

自动格式化规范工具:gofmt,goimports

命名规范:简洁易读,大小写规则,上下文信息含义(变量,函数,库包)

控制流程:避免嵌套(去除多余else),最小缩进(优先处理错误/特殊退出情况,减少嵌套),直线逻辑

错误与异常处理:简单错误(errors.New),错误判定(errors.Is,errors.As),业务中用error替代panic,recover,defer后进先出

image.png

2、代码性能优化

综合评估:

Benchmark: 基准性测试

Slice预分配内存:尽量使用make()初始化切片提供容量信息--扩容时性能下降 & 大内存未释放(copy数组高效)

map预分配内存:扩容与rehash也降低性能,提早预分配

使用strings.Builder:>ByteBuffer>>>直接+拼接(因为每次+都会重新分配内存,builder,buffer底层都是数组,使用内存扩容策略,不用每次都重新分配内存)

空结构体:struct {} 占位符,不占任何内存,或用set替代map(只需值不用键时)

Atomic包:通过硬件实现性能优化,效率比锁高,保护逻辑

避免常见的性能陷阱即可保证大部分程序的性能。

3、性能优化分析工具

靠数据,定位最大瓶颈,不要过早/过度优化

pprof工具排查: top, heap堆内存,goroutine协程,mutex锁,block阻塞

image.png

4、案例实践

采样过程与工作原理:/

优化流程:业务服务优化,基础库优化,Go语言优化。在保证功能正确前提下优化。

业务服务优化:建立评估手段(压测报告等),定位性能瓶颈(如使用库规范,高并发场景),重点改造(新旧响应数据diff对比),效果验证(再次对比新旧压测报告),进一步优化(链路分析)

基础库优化:AB test -- 库改造,数据按需获取,数据序列化协议优化

Go语言优化: 编译器 & 运行时优化 -- 优化内存分配策略+编译流程