Go学习第四天:Go性能优化 | 青训营笔记

48 阅读2分钟

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

在今天的视频课中学习了Go性能优化的相关内容

Go性能优化

基本问题

实现Go的性能优化,就是提高Go代码的运行效率,性能优化可以节约成本,提高系统运行效率,实现降本增效

性能优化层面

  • 业务层优化

    业务代码优化,需要根据具体问题具体分析

  • 语言运行时优化

    通用性优化

性能优化方向

优化时需要pprof这样的工具来提供性能数据,通过数据驱动来找到优化方向

注意事项

  • 性能优化时注意保证接口稳定
  • 测试用例要覆盖到尽可能多的场景

内存管理优化

概念

手动内存管理时存在着double-free problem,use-after-free problem的问题

对于自动内存管理有三个任务

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空概念

GC算法的评价

  • 安全性:不能回收存活对象
  • 吞吐率:花在GC上的时间要少
  • 暂停时间:业务感知
  • 内存开销

GC技术

追踪垃圾回收

回收指针指向关系不可达的对象,类似于白名单机制,除去可达的,余下都需要清理

步骤如下

  1. 标记根对象

  2. 标记可达对象

  3. 清理不可达对象

    • 将存活对象转移到另外的内存空间(Copying GC)
    • 标记死亡对象空间为可分配(Mark-sweep GC)
    • 移动并整理存活对象(Mark-compact GC),空间压缩

为了保证效率GC方式需要根据经历的GC次数变更GC策略

引用计数

缺点

  • 维护引用计数开销大,需原子操作保证引用计数正确性
  • 环形数据结构无法回收
  • 引用计数占用存储空间