高性能Go语言发行版优化与落地实践三 | 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

03、编译器和静态分析

重要的系统软件

  • 识别符合语法和明官法的程序
  • 生成正确且高效的代码 分析部分(前端)
  • 词法分析,生成词素(词汇)
  • 语法分析,生成语法树
  • 语义分析,收集类型信良,进行语义检查
  • 中间代码生成,生成中间表示(IR) 综合部分(后端)
  • 代码优化,机器无关优化,生成优化后的IR·代码生成,生成目标代码

静态分析:不执行程序代码,推导程序的行为,分析程序的性质.

控制流(控制流) :程序执行的流程数据流

(数据流) :数据在控制流上的传递

过程内分析(过程内分析) 仅在函数内部进行分析

程序间分析(过程间分析) 考虑函数调用时参数传递和返回伯的数据流和控制流

03.总结

  • 编译器的结构与编译的流程
  • 编译器后端优化
  • 数据流分析和控制流分析
  • 过程内分析和过程间分析

04.Go编译器优化

  • 为什么做编译器优化

    • 用户无冠知,声新编译即可获浔往收益
    • 通用住优化
  • 现状

    • 采用的优化少
    • 编译时I问鲛短,没有进行较索杂白别弋码分析知优化
  • 编译优化的思路

    • 场录:面向后端长期执行任务
    • 权衡:用骗译时15换取克亮效的机器9-野兽模式

函数内联

  • 内联:将被调用函数的函数体(callee)的副本替换到调用位置(caller)上,同时重写代码以反映参数的绑定

  • 优点

    • 消除至数浣用开销,例传差参数、保存高存器等
    • 将过积问分析牯化为过程内分析,帮助其他优化,例助逃数全分析

4.2 Beast Mode

  • Go亟数内联受到的限制较多

    • 语言特性,例接口,延迟等,跟制了函数内联
    • 内联策略非常保守
  • Beast Mode:调整函数内联的策略。使更多函数被内联

    • 降低函数调用的开销
    • 增加了其他优化的机会:逃逸分析 开销
    • GO镜像增加~10%
    • 编评时间增加

4.2逃逸分析

  • 逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问

  • 大致思路

    • 从对象分配处出发.沿着控制流,观察对刻的数据流

    • 若发现指针在当前作用域s:

      • 作为参数传递给其他函数·传递给全局变量
      • 传递给其他的Goroutine
      • 传递给已逃迭的指针指向的对象
    • 则指针p指向的对象逃逸出-,反之则没有递逃诧出=