这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
性能优化是什么:软件系统处理能力、时间优化
为什么要做性能优化:用户体验、资源高效利用
\ 很小的优化
性能优化的层面:
- 业务代码:propf征对特定问题、场景,容易获得较大的收益
- SDK
- 基础库
- 语言运行时优化:
- OS
- 数据驱动优化:propf工具
性能优化与软件质量:
保证接口稳定的情况下优化改进
\ 用测试用例驱动优化
\ 优化文档:优化之后能做什么
\ 隔离性:通过选项控制优化的开启
\ 可观测性:必要的日志输出
GoSDK:
- 接口方面:commands、APIS、NewAPIs\
- 实现方面:
自动内存管理的优化;
- 基本背景:
- 动态内存:程序运行时根据需求动态分配内存
- 自动内存管理(垃圾回收):保证内存使用时的安全性
- Mutator:业务线程、分配新对象
Collector:GC线程,找到存活对象,回收死亡对象的内存空间
Serial GC:pause
Paraller GC:pause
Concurrent GC:no pause mutators与collector可以同时执行 - 评价GC算法:
safety:
吞吐率:
暂停时间
内存管理 - 追踪垃圾回收:
- 标记根对象:静态变量、全局变量、常量、线程等等
- 标记:找到可达对象
- 清理:所有不可达对象(copying GC 、 Mark sweep GC 、Mark compactGC)
- 引用计数
- 每个对象都有一个关联的引用计数;对象存活的条件:引用数>0
- 例如:c++的智能指针
- 缺点:
- 开销比较大(原子操作)
- 无法回收环形数据:weak Reference
- 内存开销
- 暂停
- Generate GC分代GC
- 分代假说
- 每个对象都有年龄:经历过GC的次数
- 目的:制定GC策略
- 年轻代:很快就死掉了,需要及时更新,吞吐率高
- 老年代old generate
Go内存管理及优化:
- go内存分配(分块):
- 对象在heap上分配
- 将内存分块: mapp()方法向OS请求分配一大块内存块。
- go内存分配(缓存):
- go内存优化:
- 分配管理,对象分配;
- 小对象分配
- Balanced GC
编译器结构:
源代码-词法、语法、语义分析器——中间表示——优化代码——代码生成——目标代码
-
静态分析:不执行代码,推到程序行为,分析程序性质。 控制流:分析程序执行的流程。(Control flow) 数据流:数据在控制流上的传递。 根据程序优化程序性质
-
过程内分析和过程间分析:
- 过程内:仅在函数内部
- 过程间:数据流分析,控制流分析。
编译器优化:
- 用户无感知
- 函数内联:消除函数调用的过程。
- 缺点:编译器生成的go镜像过大。
- Beast Mode
- 逃逸分析