这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
一、本堂课重点内容
本堂课的知识点有哪些?
高性能Go语言发行版优化和落地实践
-
优化
- 内存管理优化
- 编译器优化
-
背景
- 自动内存管理和Go内存管理机制
- 编译器优化的基本问题和思路
二、详细知识点介绍
本堂课介绍了哪些知识点?
追求极致性能
-
性能优化是什么?
- 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
-
为什么要做性能优化?
- 用户体验:带来用户体验的提升
- 资源高效利用:降低成本,提高效率
性能优化的层面
-
业务代码
-
业务层优化
- 针对特定场景,具体问题,具体分析
- 容易获得较大性能收益
-
-
SDK
-
基础库
-
语言运行时
-
语言运行时优化
-
数据驱动
-
优化是什么?
- 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
二、为什么优化?
- 用户体验:带来用户体验的提升
- 资源高效利用:降低成本,提高效
三、优化点在哪?
-
业务层
- 针对特定场景,具体问题,具体分析
- 容易获得较大性能收益
-
内存管理
-
GC垃圾回收优化
-
需要保证安全性和正确性的前提下才能优化
-
评价标注:安全性,吞吐率,暂停时间,内存开销
-
追踪垃圾回收
-
清理不可达对象,三种方式:
- 将存活对象复制到另外的内存空间 (Copying GC)
- 将死亡对象的内存标记为“可分配“ (Mark-sweep GC)
- 移动并整理存活对象 (Mark-compact GC)
-
分代假说
-
-
引用计数
- 清理引用数为0的对象
- 优点
- 内存管理的操作被平摊到程序执行过程中
- 内存管理不需要了解 runtime 的实现细节
- 缺点
- 维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性
- 无法回收环形数据结构
- 内存开销:每个对象都引入的额外内存空间存储引用数目
- 回收内存时依然可能引发暂停
- 优点
- 清理引用数为0的对象
-
-
内存分配优化
- 原生分配机制
- 问题分析
-
优化方案:Balanced GC
- 使用三个指针base, end, top 维护 GAB:
- GAB 对于 Go 内存管理来说是一个对象 • 本质:将多个小对象的分配合并成一次对象的分配 • 新的问题:GAB 的对象分配方式会导致内存被延迟释放 • 方案:用 copying GC 移动 GAB 中存活的对象
-
- 本节课主要介绍了一个性能分析工具 —— pprof
主要可以分为:CPU、堆内存、协程、锁、阻塞、线程创建方面的优化,pprof提供了很方便的工具可以帮助我们定位错误。在线会生成 .dot 图像,可以下载 Graphviz 进行图像的查看。