青训营Day4 性能优化| 青训营笔记

82 阅读2分钟

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

性能优化基本问题

什么是性能优化?

提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

为什么要做性能优化?

  1. 用户体验:降低平均延迟或尾延迟,提高用户体验
  2. 公司成本:降低成本,提高效率

性能优化建议

Benchmark

在某个包下,该包内包含 BenchmarkXxx(b *testing.B) 函数,命令行输入:go test -bench=. -benchmem,执行基准性能测试。

slice

  1. 尽可能在使用 make() 初始化切片时提供容量信息,避免连续 append() 操作导致的多次内存分配和内存拷贝操作;
  2. 在已有切片基础上,创建大切片,可以考虑申请一个小切片,再执行 copy 操作,使原切片及时得到释放。

map

创建 map 前也可以提前预分配内存,避免触发 map 的扩容,减少内存拷贝和 Rehash 的消耗。

字符串处理

在字符串拼接中,+ 性能最差,strings.Builder,bytes.Buffer 相近,strings.Buffer 更快。

空结构体

go没有 set 类型,因此,可以使用空结构体作为 map 的值,相比 bool 类型,没有一个元素,节省1个字节空间。

atomic包

当临界区很小时,可以考虑使用atomic包中的函数。

Go语言性能优化

性能优化层面

  1. 业务层优化
    • 针对特定场景,具体问题,具体分析
    • 容易获得较大性能收益
  2. 语言运行时优化
    • 解决更通用的性能问题
    • 考虑更多场景
    • Tradeoffs
  3. 数据驱动
    • 自动化性能分析工具 —— pprof
    • 依靠数据而非猜测
    • 首先优化最大瓶颈

性能优化与软件质量

  1. 保证接口稳定的前提下改进实现
  2. 测试驱动
  3. 通过清晰的文档告诉用户这一项优化做了什么,没做什么,能达到怎样的效果
  4. 隔离,优化代码用选项和原先的路径隔离,保证优化未启用时的行为同以前一致
  5. 可观测、可灰度、可回滚