-
性能优化\
-
业务层优化\
- 针对特定场景,具体问题,具体分析\
- 容易获得较大性能收益\
-
语言运行时优化\
- 解决更通用的性能问题\
- 考虑更多场景\
- Tradeoffs\
-
数据驱动\
- 自动化性能分析工具 —— pprof\
- 依靠数据而非猜测\
- 首先优化最大瓶颈\
-
-
自动内存管理\
-
动态内存\
- 程序运行时根据需求动态分配的内存\
-
自动内存管理(垃圾回收)\
- 由程序语言运行时系统管理动态内存\
-
任务\
- 为新对象分配空间\
- 找到存活对象\
- 回收死亡对象的内存空间\
-
相关概念\
-
mutator\
- 业务线程,分配新对象,修改对象指向关系\
-
collector\
- gc对象,找到存活对象,回收死亡对象的内存空间\
-
serial gc\
- 只有一个collector\
\
-
parallel gc\
- 支持多个collector同时回收的gc算法\
\
-
concurrent gc\
- mutator和collector同时执行\
\
-
评价gc算法\
-
安全性\
- 不能回收存活对象\
-
吞吐率\
- gc时间/程序总花费时间\
-
暂停时间\
- stw业务是否感知\
-
内存开销\
- gc元数据开销\
-
-
-
算法\
- 追踪垃圾回收\
- 引用计数\
-
分代gc\
- 针对不同的对象使用不同的策略\
-
-
go内存管理及优化\
-
go内存分配\
-
分块\
- 为对象在heap上分配内存\
-
提前将内存分快\
- 调用系统调用mmap()申请一大块内存\
-
先将内存划分为大块,称作mspan\
-
noscan mspan\
- 分配不包含指针的对象\
- gc不需要扫描\
-
scan mspan\
- 分配包含指针的对象\
- gc需要扫描\
-
- 再将大块划分为特定大小的小块,用于对象分配\
-
- TCMalloc\
- mmap() 系统调用\
- scan object 和 noscan object\
- mspan, mcache, mentral\
- Bump-pointer object allocation: 指针碰撞风格的对象分配\
-
-
编译器和静态分析\
- 词法分析\
- 语法分析\
- 语义分析\
- Intermediate representation (IR) 中间表示\
- 代码优化\
- 代码生成\
- Control flow: 控制流\
- Data flow: 数据流\
- Intra-procedural analysis 过程内分析\
- Inter-procedural analysis: 过程间分析\
- 作者:青训营官方账号\
- 来源:稀土掘金\
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\
-
Go 编译器优化\
- Function inlining: 函数内联\
- Escape analysis: 逃逸分析\