这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
性能优化与软件质量
- 软件质量至关重要
- 在保证接口稳定的前提下改进具体实现
- 测试用例:覆盖尽可能多的场景,方便回归
- 文档:做什么,没做什么,能达到怎样的效果
- 隔离:通过选项控制是否开启优化
- 可观测:必要的日志输出
自动内存管理
由程序语言的运行时系统回收动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内存使用时的正确性和安全性:double-free problem, use-after-free problem
三个任务
- 为新对象分配空间
- 找到存活的对象
- 回收死亡对象的内存空间
自动内存管理-相关概念
- Mutator:业务线程,分配新对象,修改对象指向关系
- Collector:GC线程,找到存活对象,回收死亡对象的内存空间
- Serial GC:只有一个collector
- Parallel GC:支持多个collectors同时回收的GC算法
- Concurrent GC:mutator(s) 和 collector(s)可以同时执行
Go内存及优化
Go内存分配-分块
- 目标:为对象在heap上分配内存
- 提前将内存分块
- 对象分配:根据对象的大小选择合适的块返回
Balanced GC
编译器和静态分析
静态分析
- 静态分析:不执行程序代码,推导程序的行为,分析程序的性质。
- 控制流(Control flow):程序执行的流程
- 数据流(Data flow):数据在控制流上的传递
Go编译器优化
函数内联
- 内联:将被调用的函数的函数体(callee)的副本替换到调用的位置(caller)上,同时重写代码以翻译参数的绑定
- 优点
- 消除函数调用开销,例如传递参数,保存寄存器等
- 将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析