这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
在今天的视频课中学习了Go性能优化的相关内容
Go性能优化
基本问题
实现Go的性能优化,就是提高Go代码的运行效率,性能优化可以节约成本,提高系统运行效率,实现降本增效
性能优化层面
-
业务层优化
业务代码优化,需要根据具体问题具体分析
-
语言运行时优化
通用性优化
性能优化方向
优化时需要pprof这样的工具来提供性能数据,通过数据驱动来找到优化方向
注意事项
- 性能优化时注意保证接口稳定
- 测试用例要覆盖到尽可能多的场景
内存管理优化
概念
手动内存管理时存在着double-free problem,use-after-free problem的问题
对于自动内存管理有三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空概念
GC算法的评价
- 安全性:不能回收存活对象
- 吞吐率:花在GC上的时间要少
- 暂停时间:业务感知
- 内存开销
GC技术
追踪垃圾回收
回收指针指向关系不可达的对象,类似于白名单机制,除去可达的,余下都需要清理
步骤如下
-
标记根对象
-
标记可达对象
-
清理不可达对象
- 将存活对象转移到另外的内存空间(Copying GC)
- 标记死亡对象空间为可分配(Mark-sweep GC)
- 移动并整理存活对象(Mark-compact GC),空间压缩
为了保证效率GC方式需要根据经历的GC次数变更GC策略
引用计数
缺点
- 维护引用计数开销大,需原子操作保证引用计数正确性
- 环形数据结构无法回收
- 引用计数占用存储空间