这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
性能优化的目的
提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
优化的层面
- 业务层优化:主要针对特定场景,具体问题具体分析
- 语言运行时优化:解决通用性能问题
自动内存管理
主要任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
自动内存管理的主要方法
追踪垃圾回收
回收条件:指针指向关系不可达的对象
标记根对象:静态变量、全局变量、常量、超线程等
引用计数
每个对象都有一个与之关联的引用数目
对象存活条件:
当且仅当引用数大于0
优点:
内存管理的操作被平摊到程序执行过程中
内存管理不需要了解runtime的实现细节:C++智能指针(smart pointer)
Go内存管理及优化
内存分配-分块
目标:为对象在heap上分配内存
对象分配:根据对象的大小,选择最合适的块返回\
Go内存优化
对象分配是非常高频的操作
小对象占比较高
Go内存分配比较耗时\
优化方案
balanced GC:
每个goroutine都绑定一大块内存
GAB用于noscan类型的小对象分配
使用三个指针维护GAB:base,end,top
Bump pointer(指针碰撞)风格对象分配\
- 无需和其他分配请求互斥
- 分配动作简单高效
编译器和静态分析
编译器结构
分析部分(前端)
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成 综合部分(后端)
- 代码优化
- 目标代码生成
静态分析
不执行程序代码,推导程序的行为,分析程序的性质
控制流:程序执行的流程
数据流:数据在控制流上的传递