性能优化及Go内存管理| 青训营笔记

59 阅读2分钟

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

性能优化的目的

提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

优化的层面

  1. 业务层优化:主要针对特定场景,具体问题具体分析
  2. 语言运行时优化:解决通用性能问题

自动内存管理

主要任务
  1. 为新对象分配空间
  2. 找到存活对象
  3. 回收死亡对象的内存空间
自动内存管理的主要方法
追踪垃圾回收

回收条件:指针指向关系不可达的对象
标记根对象:静态变量、全局变量、常量、超线程等

引用计数

每个对象都有一个与之关联的引用数目 对象存活条件:
当且仅当引用数大于0
优点:
内存管理的操作被平摊到程序执行过程中
内存管理不需要了解runtime的实现细节:C++智能指针(smart pointer)

Go内存管理及优化

内存分配-分块

目标:为对象在heap上分配内存
对象分配:根据对象的大小,选择最合适的块返回\

Go内存优化

对象分配是非常高频的操作
小对象占比较高
Go内存分配比较耗时\

优化方案

balanced GC:
每个goroutine都绑定一大块内存
GAB用于noscan类型的小对象分配
使用三个指针维护GAB:base,end,top
Bump pointer(指针碰撞)风格对象分配\

  1. 无需和其他分配请求互斥
  2. 分配动作简单高效

编译器和静态分析

编译器结构

分析部分(前端)

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成 综合部分(后端)
  5. 代码优化
  6. 目标代码生成
静态分析

不执行程序代码,推导程序的行为,分析程序的性质
控制流:程序执行的流程
数据流:数据在控制流上的传递