L3 高质量编程与性能调优实战
高质量编程
原则: 简单性、可读性、生产力
常见编码规范:
*代码格式 * gofmt自动格式化代码,与官方一致
*注释 * 作用、如何做的、实现的原因、什么情况出错 公共符号始终要注释
命名规范
variable 简洁 缩略词全大写
function 简短,不必携带包名上下文信息
package 小写字母,不能与标注框同名,单数,不用常用变量名
控制流程
避免嵌套 最小缩进 可读
错误和异常处理
简单错误
错误wrap和Unwrap
错误判定 errors.Is 特定的错误 errors.As错误链上获取特定种类的错误
panic 不建议业务中用,程序不能继续
recover 只能在defer中用,嵌套无法生效,当前goroutine,生肖分为
性能优化 benchmark
slice 预分配内存 make()初始化切片时提供容量信息
大内存未释放 copy取代re-slice
map预分配内存
不断向map添加元素会引发扩容
字符串处理
+拼接最差,strings.Builder和bytes.Buffer相近,String.Buffer更快 strings.Builder
空结构体 占位符 不占用空间 set可以考虑用map代替
atomic包 通过硬件实现,而不是锁,效率高
性能调优实战
性能分析工具pprof
采样:CPU heap堆内存 协程goroutine 锁mutex 阻塞block 线程创建
L4 高性能 Go 语言发行版优化与落地实践
自动内存管理
GC 垃圾回收
追踪垃圾回收
引用计算
分代GC
Go内存管理及优化
分块
缓存
Go对象分配的性能问题
分配路径过长
小对象居多
Balanced GC
Go编译器优化
beast mode
函数内联
逃逸分析
通过micro-benchmark 快速验证性能优化
自动内存管理
- Auto memory management: 自动内存管理
- Grabage collction: 垃圾回收
- Mutator: 业务线程
- Collector: GC 线程
- Concurrent GC: 并发 GC
- Parallel GC: 并行 GC
-
Tracing garbage collection: 追踪垃圾回收
- Copying GC: 复制对象 GC
- Mark-sweep GC: 标记-清理 GC
- Mark-compact GC: 标记-压缩 GC
- Reference counting: 引用计数
-
Generational GC: 分代 GC
- Young generation: 年轻代
- Old generation: 老年代
\