这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
主要内容:go语言优化、go自动内存管理
性能优化
性能优化:提高软件的处理能力,减少不必要的消耗,充分发掘计算机算力。从而提高用户体验,资源高效利用,降低成本。
性能优化的层面:
业务层优化:针对特定场景,具体问题,容易获得较大性能收益。
语言运行时优化:解决通用的性能问题,考虑更多场景。
数据驱动:使用自动化性能分析工具pprof,依靠数据而不是猜测,首先优化最大瓶颈。
自动内存管理
保证内存使用的正确性和安全性。
任务:为新对象分配空间,找到存活对象,回收垃圾对象。
GC类型:serial GC 、parallel GC 、 Concurrent GC。
评价GC算法:
- 安全性:不能回收存活的对象,基本要求
- 吞吐率
- 暂停时间
- 内存开销
追踪垃圾回收
追踪垃圾回收的流程:标记根对象、找到可达对象、清除所有不可达对象。
根据对象的生命周期来选择不同的分配回收算法。
每个对象可以设置一个年龄,每经过一次GC年龄加一,根据年龄的大小采用不同的策略。 对于年龄小的,我们使用copying collection方法。对于年龄大的我们使用mark-sweep GC方法。
引用计数
每个对象都有一个与之相关联的引用数目,对象存活条件,当且仅当引用数大于0.
优点:内存管理的操作被平摊到程序执行过程中。
缺点:维护引用开销大,无法回收唤醒数据结构,回收内存仍然可能引发暂停。
Go内存分配
分块 mspan:8KB
多级缓存:mcache、mcentral、mheap。
对象分配是非常高频的操作,小对象占比更多。
go内存分配的路径太长了。
Balanced GC
GAB:将多个小对象合并成一个大对象分配。问题:可能导致对象延迟释放。
使用指针碰撞风格的对象分配。
静态分析
控制流分析:程序执行的流程。
数据流分析:数据在控制流上的传递。
过程内分析:尽在函数内部进行分析。
过程间分析:考虑过程调用时参数传递和返回值的数据流和控制流。
go编译器优化
现状:采用的优化少,编译时间短,没有进行较复杂的代码分析和优化。
优化:函数内联、逃逸分析