高性能Go优化(下)——Go青训营笔记

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

2. Go内存管理

Go内存分配

分块

  • 目标:为对象在head上分配内存

  • 提前将内存分块

    • image-20220622162752871
  • 对象分配:根据对象的大小,选择最合适的快返回

缓存

image-20220622163416070

Go内存管理优化

image-20220622163733356

  • 要点:

image-20220623203804477

优化方案——Balanced GC

image-20220623212031793

image-20220623214656114

总结

image-20220623215117073

3. 编译器和静态分析

基本介绍

image-20220624160106555

  • 重要的系统软件

    • 识别符合语法和非法程序
    • 生成高效且正确的代码
  • 分析部分(前端 front end)

    • 词法分析,生成词素(lexeme)
    • 语法分析,生成语法树
    • 语义分析,收集类型信息,进行语义检查
    • 中间代码生成,生成intermediate representation(IR)
  • 综合部分(后端 back end)

    • 代码优化,机器无关优化,生成优化后的IR
    • 代码生成,生成目标代码

静态分析(重要)

image-20220624162833551

过程内分析和过程间分析

  • 过程内分析(Intra-procedural analysis)

    • 仅在函数内部进行分析
  • 过程间分析(Inter-procedural analysis)

    • 考虑函数调用时参数传递和返回值的数据流和控制流

image-20220624163050538

小节:

image-20220624163117932

4. Go编译器优化

概况

image-20220624202939878

函数内联(Inlining)

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

  • 优点:

    • 消除函数调用开销,例如传递参数、保存寄存器等
    • 将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析
  • 缺点

    • 函数体变大,instruction cache (icache)不友好
    • 编译生成的Go镜像变大
  • 函数内联在大多数情况下是正向优化

  • 内联策略

    • 调用和被调函数的规模

image-20220624204912173

image-20220624204930221

Beast Mode

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

    • 语言特性,例如interface, defer 等,限制了函数内联
    • 内联策略非常保守
  • Beast mode:调整函数内联的策略,使更多函数被内联

    • 降低函数调用的开销
    • 增加了其他优化的机会:逃逸分析。
  • 开销

    • Go镜像增加~10%
    • 编译时间增加

逃逸分析

image-20220624210856292

性能收益

image-20220624210958214

总结

image-20220624211710000

posted @ 2022-06-25 10:53  Luciferpluto  阅读(0)  评论(0)    收藏  举报  来源