这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
性能优化基本问题
什么是性能优化?
提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
为什么要做性能优化?
- 用户体验:降低平均延迟或尾延迟,提高用户体验
- 公司成本:降低成本,提高效率
性能优化建议
Benchmark
在某个包下,该包内包含 BenchmarkXxx(b *testing.B) 函数,命令行输入:go test -bench=. -benchmem,执行基准性能测试。
slice
- 尽可能在使用 make() 初始化切片时提供容量信息,避免连续 append() 操作导致的多次内存分配和内存拷贝操作;
- 在已有切片基础上,创建大切片,可以考虑申请一个小切片,再执行 copy 操作,使原切片及时得到释放。
map
创建 map 前也可以提前预分配内存,避免触发 map 的扩容,减少内存拷贝和 Rehash 的消耗。
字符串处理
在字符串拼接中,+ 性能最差,strings.Builder,bytes.Buffer 相近,strings.Buffer 更快。
空结构体
go没有 set 类型,因此,可以使用空结构体作为 map 的值,相比 bool 类型,没有一个元素,节省1个字节空间。
atomic包
当临界区很小时,可以考虑使用atomic包中的函数。
Go语言性能优化
性能优化层面
- 业务层优化
- 针对特定场景,具体问题,具体分析
- 容易获得较大性能收益
- 语言运行时优化
- 解决更通用的性能问题
- 考虑更多场景
- Tradeoffs
- 数据驱动
- 自动化性能分析工具 —— pprof
- 依靠数据而非猜测
- 首先优化最大瓶颈
性能优化与软件质量
- 保证接口稳定的前提下改进实现
- 测试驱动
- 通过清晰的文档告诉用户这一项优化做了什么,没做什么,能达到怎样的效果
- 隔离,优化代码用选项和原先的路径隔离,保证优化未启用时的行为同以前一致
- 可观测、可灰度、可回滚