高性能 Go 语言发行版优化与落地实践 | 青训营笔记

86 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

性能优化与软件质量

  • 软件质量至关重要
  • 在保证接口稳定的前提下改进具体实现
  • 测试用例:覆盖尽可能多的场景,方便回归
  • 文档:做什么,没做什么,能达到怎样的效果
  • 隔离:通过选项控制是否开启优化
  • 可观测:必要的日志输出

自动内存管理

由程序语言的运行时系统回收动态内存

  • 避免手动内存管理,专注于实现业务逻辑
  • 保证内存使用时的正确性和安全性:double-free problem, use-after-free problem

三个任务

  • 为新对象分配空间
  • 找到存活的对象
  • 回收死亡对象的内存空间

自动内存管理-相关概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector:GC线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC:只有一个collector
  • Parallel GC:支持多个collectors同时回收的GC算法
  • Concurrent GC:mutator(s) 和 collector(s)可以同时执行

image.png

Go内存及优化

Go内存分配-分块

  • 目标:为对象在heap上分配内存
  • 提前将内存分块
  • 对象分配:根据对象的大小选择合适的块返回

Balanced GC

image.png

编译器和静态分析

image.png

静态分析

  • 静态分析:不执行程序代码,推导程序的行为,分析程序的性质。
  • 控制流(Control flow):程序执行的流程
  • 数据流(Data flow):数据在控制流上的传递

image.png

Go编译器优化

函数内联

  • 内联:将被调用的函数的函数体(callee)的副本替换到调用的位置(caller)上,同时重写代码以翻译参数的绑定
  • 优点
    • 消除函数调用开销,例如传递参数,保存寄存器等
    • 将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析

image.png