「4」性能调优|trade off 编译优化|青训营笔记

252 阅读3分钟

创建时间: May 17, 2022 2:26 PM 标签: 编译优化

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。

何为性能调优

  • 编码之外部分的性能调优可以解释为:

    • 从语言和操作系统角度考虑”如何更好的利用硬件资源,发掘计算机算力“。
  • 性能优化的收益:

    • 在拥有数量庞大的计算集群中,微小优化可能带来巨大的性能提升。

性能优化分层

  1. 业务代码
  2. SDK
  3. 基础库
  4. 语言运行时
  5. OS

业务层优化

  • 针对特定的业务场景调整业务编码

    影响面:业务线的下游。

语言运行时优化

  • 解决更加通用的性能问题
  • 考虑更多场景

性能优化原则:数据驱动,性能优化是Trade Off,需要结合数据权衡收益和代价,即权衡优化是否真的带来提升。

编译优化

编译概念定义

过程内分析

函数执行内部流程的分析,比如解析函数的各种条件分支、迭代等执行流程。

过程间分析

函数调用间过程,相对复杂,

编译器执行过程分析会耗时,但有助于编译器掌握程序的流程信息,从而做成编译优化,输出更高质量的代码,trade off,本质是编译时间和执行效率直接的权衡。

内联

即将函数调用直接转换为语句执行。

  • 为什么认为内联可以优化?

    • 在调用函数的过程中,程序的状态机模型会发生转移,会用栈帧暂存程序状态。
    • 进入下一个函数的执行过程中,会先暂存当前函数状态,栈帧入栈,当下一个函数执行完成后会,执行出栈,返回上一个栈帧继续执行。
    • 如果存在频繁的小函数调用的话则会导致频繁创建栈帧→入栈→出栈的过程,这样的程序被认为效率是不高的。

编码测试可以发现内联后的函数可以获得较大性能提升 没有本地测试,偷的老师ppt

  • 并且可以将函数间流程分析简化为函数内流程分析,大大提升了其他静态分析的优化空间。

    • 代价:编译产出二进制文件体积会增加。

逃逸

指对象在堆空间上创建后逃逸到堆空间的现象。

逃逸会带来什么问题?

GC 压力增大,在堆上的空间需要通过 GC 回收,从而可能导致性能瓶颈。

内联有可能减少逃逸的发生,当然也得满足 Golang 内存逃逸规则。

对于指针 p 在当前作用域 s

  1. 作为参数传递给其他函数
  2. 传递给全局变量(怎么定义全局变量,包内 var 算吗?
  3. 传递给其他 goroutine (等同于传递给其他函数
  4. 传递给已逃逸的指针指向的对象。