这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
本堂课重点内容:
- 自动内存管理
- go内存管理以及优化
- 编译器静态分析
- go编译器优化
详细知识点介绍:
性能优化:
性能优化主要针对以下几个层面:
-
业务层优化
针对特定的场景进行优化,例如一个功能使用一些算法进行实现,降低时间复杂度,比较容易获得较大的性能收益
-
运行时优化
优化的范围更广泛,即使优化的幅度不大,但许多程序都能用到该优化综合起来也是很大的性能节约
-
根据运行结果优化
依靠pprof工具进行的优化,找到程序占用资源较多的地方进行优化,从而使得程序有更好的时间复杂度与空间复杂度。注意,要在保证接口稳定的情况下改进接口实现。
GO语言的自动内存管理
- 分块
先申请一大块内存,然后划分大块,然后再划分成特定大小的小块
分配时:根据对象大小选择最合适的块
- 内存管理优化
对象分配是非常高频的操作。对大公司来说,每秒或许分配GB级别的内存
内存较小的对象占比较高
所以go的内存分配比较耗时
-
字节内部的优化方案 Banlanced GC
-
每个g都绑定一大块内存,
-
GAB用于noscan类型的小对象分配
-
使用三个子还真维护GAB:base基址 end 结束地址 top当前地址
-
指针碰撞风格的对象分配
-
不需要和其他请求互斥
-
分配动作简单且高效
-
-
编译器静态分析
-
不执行代码,通过推导程序的行为来分析程序的性质
-
控制流: 程序的执行流程
-
数据流: 数据在控制流上的传递
-
编译器静态分析: 通过分析控制流和数据流进行编译优化,通过分析最后可能的结果,然后根据结果进行代码的优化。
Go编译器的优化
-
优点: 重新编译即可获得性能收益,覆盖面积广,对性能的提升多
-
缺点: 编译时间延长
总结
这两节课总结了一些编译优化的方法,对go语言的性能调优有了一定的理解。总体的知识偏概念性。凭感觉来说,这里的优化已经比较底层,相关的知识可能会到挺久之后才能用到。希望到时候我再回来看到这篇文章,能够重新看一遍视频,获得新的收获。