这是我参与「第五届青训营」伴学笔记创作活动的第 4 天
一、本堂课重点内容:
- 性能优化
- 自动内存管理
- 编译器和静态分析
- 编译器优化
二、详细知识点介绍:
-
性能优化
性能优化可以提升软件处理系统的能力,使资源高效利用并提升用户体验。
性能优化的层面:
- 业务层优化:针对特定场景,具体问题,具体分析;比较容易获得较大的性能收益
- 语言运行时优化:解决更通用的性能问题;考虑更多场景
-
自动内存管理
通过自动内存管理(垃圾回收),我们可以避免手动释放内存,将注意力专注在业务逻辑实现。
GC相关名词:- Mutator:业务线程,分配新对象,修改对象指向关系;
- Collector:GC 线程,找到存活对象,回收死亡对象的内存空间;
- Serial GC(串行 GC):只有一个 collector;
- Parallel GC(并行 GC):支持多个 collectors 同时回收的 GC 算法;
- Concurrent GC(并发 GC):mutator(s) 和 collector(s) 可以同时执行
对GC算法的评价因素:
- 安全性:不能回收存活的对象 (基本要求)
- 吞吐率:计算公式:
1 - GC时间 / 程序执行总时间 - 暂停时间:垃圾回收导致业务线程挂起(暂停)的时间(stop the world, 简称STW)
- 内存开销:GC元数据开销
-
追踪垃圾回收
go目前使用到的垃圾回收算法
基本步骤: 标记根节点 -> 标记可达对象 -> 清除不可达对象
如果采用并行GC,会出现在标记的同时又插入新节点,为了避免新加入的节点被当作未标记节点而被清除掉,可以采用三色标记。
-
分代GC
看参照JVM,分年轻代和老年代
-
内存管理
- 分块
- 缓存
- 优化
- 对象分配是非常高频的操作:每秒分配GB级别的内存
- 空间较小的对象占比比较高
- Go内存分配比较耗时(分配路径长:g -> m -> p -> mcache -> mspan -> memory block -> return pointer)
- 字节跳动解决方案:
Balanced GC
-
编译器优化
- 函数内联
- 逃逸分析
三、课后个人总结:
有效的分析和优化能对程序运行有较好的性能提升;go的自动垃圾回收机制使我们可以专心于代码业务逻辑的实现。
四、引用参考:
字节内部课: 高性能 Go 语言发行版优化与落地实践