高性能 Go 语言发行版优化 | 青训营笔记

120 阅读3分钟

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

性能优化是什么:软件系统处理能力、时间优化

为什么要做性能优化:用户体验、资源高效利用
\          很小的优化
性能优化的层面:

  1. 业务代码:propf征对特定问题、场景,容易获得较大的收益
  2. SDK
  3. 基础库
  4. 语言运行时优化:
  5. OS
  6. 数据驱动优化:propf工具 性能优化与软件质量:   保证接口稳定的情况下优化改进
    \           用测试用例驱动优化
    \           优化文档:优化之后能做什么
    \            隔离性:通过选项控制优化的开启
    \            可观测性:必要的日志输出

GoSDK:

  1. 接口方面:commands、APIS、NewAPIs\
  2. 实现方面:

自动内存管理的优化;

  • 基本背景:
    1. 动态内存:程序运行时根据需求动态分配内存
    2. 自动内存管理(垃圾回收):保证内存使用时的安全性
    3. Mutator:业务线程、分配新对象
      Collector:GC线程,找到存活对象,回收死亡对象的内存空间
      Serial GC:pause
      Paraller GC:pause
      Concurrent GC:no pause mutators与collector可以同时执行
    4. 评价GC算法: safety:
      吞吐率:
      暂停时间
      内存管理
    5. 追踪垃圾回收:
      1. 标记根对象:静态变量、全局变量、常量、线程等等
      2. 标记:找到可达对象
      3. 清理:所有不可达对象(copying GC 、 Mark sweep GC 、Mark compactGC)
    6. 引用计数
      1. 每个对象都有一个关联的引用计数;对象存活的条件:引用数>0
      2. 例如:c++的智能指针
      3. 缺点:
        1. 开销比较大(原子操作)
        2. 无法回收环形数据:weak Reference
        3. 内存开销
        4. 暂停
  • Generate GC分代GC
    1. 分代假说
    2. 每个对象都有年龄:经历过GC的次数
    3. 目的:制定GC策略
    4. 年轻代:很快就死掉了,需要及时更新,吞吐率高
    5. 老年代old generate

Go内存管理及优化:

  • go内存分配(分块):
    1. 对象在heap上分配
    2. 将内存分块: mapp()方法向OS请求分配一大块内存块。
  • go内存分配(缓存):
  • go内存优化:
    1. 分配管理,对象分配;
    2. 小对象分配
  • Balanced GC

编译器结构:

源代码-词法、语法、语义分析器——中间表示——优化代码——代码生成——目标代码
  • 静态分析:不执行代码,推到程序行为,分析程序性质。 控制流:分析程序执行的流程。(Control flow) 数据流:数据在控制流上的传递。 根据程序优化程序性质

  • 过程内分析和过程间分析:

    • 过程内:仅在函数内部
    • 过程间:数据流分析,控制流分析。

编译器优化:

  1. 用户无感知
  2. 函数内联:消除函数调用的过程。
  3. 缺点:编译器生成的go镜像过大。
  4. Beast Mode
  5. 逃逸分析