这是我参与「第五届青训营」笔记创作活动的第5天。 今天的课程分为内存管理优化和编译器优化。首先介绍了性能优化以及为什么要性能优化,介绍性能优化的层面时着重说了业务层优化和语言运行时优化,优化时最重要的还是要保证质量。然后老师介绍了自动化内存管理的概念,这里面的gc即garbage collection是我第一次认识这个名词,虽然它指的自动内存管理我早就了解过,以及自动内存管理的三个任务,即为新对象分配空间、找到存活对象和回收死亡对象的内存空间,然后介绍了一些相关名词的概念hh和评价gc算法的一些指标,然后介绍了一些gc算法,比如tracing garbage collection、reference counting、generational gc的原理以及清理死亡对象的方法,有copying gc、mark-sweep gc和mark-compact gc,每种gc算法都有各自的优劣性,要结合特定的场景决定采用哪种算法并且根据不同的对象选择不同的清理方法。然后介绍了go的内存分配策略,主要介绍了分块和缓存,然后通过go内存分配的问题出发开始介绍内存管理的优化,在这里介绍了字节内部采用的balanced gc,通过GAB分配noscan类型的小对象,GAB即是小对象集合成的大对象,然后介绍了存在的问题即解决方案,这种分配方式简单有效,在线上场景可以减少一定的cpu占用。之后介绍了编译器的结构,以及编译器后端优化中的静态分析,其中介绍了控制流和数据流的概念和分析方法,以及过程内分析和过程间分析的概念,而过程间分析比较复杂,需要花费较多编译时间,因此需要尽可能减少过程间分析以进行优化,在编译器优化中介绍了函数内联,并且通过例子证明内联后性能确实提高了,还介绍了逃逸分析的概念,两者结合可以减少过程间分析,优化的同时尽可能减少了编译时间。这节课涉及到许多新知识新概念,我之后会经常回顾笔记,巩固概念。