GO中性能优化 | 青训营笔记

30 阅读2分钟

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

首先是前置知识

自动内存管理

  • Auto memory management: 自动内存管理
  • Grabage collction: 垃圾回收
  • Mutator: 业务线程
  • Collector: GC 线程
  • Concurrent GC: 并发 GC
  • Parallel GC: 并行 GC
  • Tracing garbage collection: 追踪垃圾回收

    • Copying GC: 复制对象 GC
    • Mark-sweep GC: 标记-清理 GC
    • Mark-compact GC: 标记-压缩 GC
  • Reference counting: 引用计数
  • Generational GC: 分代 GC

    • Young generation: 年轻代
    • Old generation: 老年代

Go 内存管理及优化

  • TCMalloc
  • mmap() 系统调用
  • scan object 和 noscan object
  • mspan, mcache, mentral
  • Bump-pointer object allocation: 指针碰撞风格的对象分配

编译器和静态分析

  • 词法分析
  • 语法分析
  • 语义分析
  • Intermediate representation (IR) 中间表示
  • 代码优化
  • 代码生成
  • Control flow: 控制流
  • Data flow: 数据流
  • Intra-procedural analysis 过程内分析
  • Inter-procedural analysis: 过程间分析

Go 编译器优化

  • Function inlining: 函数内联
  • Escape analysis: 逃逸分析

了解了这些后老师开始讲 在GO中如何进行性能优化

主要这几个方面 追踪垃圾回收 引用计数 以及内存缓存

QQ截图20230119174249.png

其中最值得注意到个人认为应该是字节自己的性能优化

字节中 经过分析后发现 更多代码运行的小块 并不需要很大的内存 所以做了一个资源整合的操作 类似 自己提前分配好了一个 一定大小的内存块 自定 GAB(per-g allocation buffer)

然后讲GAB中设置指针计数 只需要讲这些小的放入这个GAB中就可以 优化小的代码块内存的分配 即使这个内存块中 有很大的空缺 也可以使用copy复制到另一个整合的内存块中 大大降低了内存空间的浪费

b2430d70a8e642b593f9de816e1359d5_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

参考引用:juejin.cn/post/718952…