创建时间: May 17, 2022 2:26 PM 标签: 编译优化
这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
何为性能调优
-
编码之外部分的性能调优可以解释为:
- 从语言和操作系统角度考虑”如何更好的利用硬件资源,发掘计算机算力“。
-
性能优化的收益:
- 在拥有数量庞大的计算集群中,微小优化可能带来巨大的性能提升。
性能优化分层
- 业务代码
- SDK
- 基础库
- 语言运行时
- OS
业务层优化
-
针对特定的业务场景调整业务编码
影响面:业务线的下游。
语言运行时优化
- 解决更加通用的性能问题
- 考虑更多场景
性能优化原则:数据驱动,性能优化是Trade Off,需要结合数据权衡收益和代价,即权衡优化是否真的带来提升。
编译优化
编译概念定义
过程内分析
函数执行内部流程的分析,比如解析函数的各种条件分支、迭代等执行流程。
过程间分析
函数调用间过程,相对复杂,
编译器执行过程分析会耗时,但有助于编译器掌握程序的流程信息,从而做成编译优化,输出更高质量的代码,trade off,本质是编译时间和执行效率直接的权衡。
内联
即将函数调用直接转换为语句执行。
-
为什么认为内联可以优化?
- 在调用函数的过程中,程序的状态机模型会发生转移,会用栈帧暂存程序状态。
- 进入下一个函数的执行过程中,会先暂存当前函数状态,栈帧入栈,当下一个函数执行完成后会,执行出栈,返回上一个栈帧继续执行。
- 如果存在频繁的小函数调用的话则会导致频繁创建栈帧→入栈→出栈的过程,这样的程序被认为效率是不高的。
编码测试可以发现内联后的函数可以获得较大性能提升
没有本地测试,偷的老师ppt
-
并且可以将函数间流程分析简化为函数内流程分析,大大提升了其他静态分析的优化空间。
- 代价:编译产出二进制文件体积会增加。
逃逸
指对象在堆空间上创建后逃逸到堆空间的现象。
逃逸会带来什么问题?
GC 压力增大,在堆上的空间需要通过 GC 回收,从而可能导致性能瓶颈。
内联有可能减少逃逸的发生,当然也得满足 Golang 内存逃逸规则。
对于指针 p 在当前作用域 s
- 作为参数传递给其他函数
- 传递给全局变量(怎么定义全局变量,包内 var 算吗?
- 传递给其他 goroutine (等同于传递给其他函数
- 传递给已逃逸的指针指向的对象。