这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
前言
这是小白初接触到Go语言的内容,本课程高性能Go语言发行版优化与落地实践。
主要讲述自动内存管理、Go 内存管理及优化、编译器和静态分析、Go编译器优化
(1)性能优化是什么?
提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
为什么要做性能优化?
用户体验:带来用户体验的提升
资源高效利用:降低成本,提高效率
(2)自动内存管理和Go 内存管理及优化 1.自动内存管理(垃圾回收) :由程序语言的运行时系统管理动态内存
避免手动内存管理,专注于实现业务逻辑
保证内存使用的正确性和安全性: double- free problem, use- after- free problem
2.基本概念
Mutator:业务线程,分配新对象,修改对象指向关系
Collector: GC线程,找到存活对象,回收死亡对象的内存空间
Serial GC:只有一个collector
Parallel GC:支持多个collectors同时回收的GC算法
Concurrent GC: mutator(s)和collector(s)可以同时执行
3.评价GC算法
安全性(Safety):不能回收存活的对象 基本要求
吞吐率(Throughput): 花在GC上的时间
暂停时间(Pause time): stop the world (STW) 业务是否感知
内存开销(Space overhead) GC元数据开销
追踪垃圾回收(Tracing garbage collection)
引用计数(Reference counting)
(3)编译器和静态分析和Go编译器优化
1.为什么做编译器优化:
用户无感知,重新编译即可获得性能收益
通用性优化
2.现状
采用的优化少
编译时间较短,没有进行较复杂的代码分析和优化
3.编译优化的思路
场景:面向后端长期执行任务
Tradeoff:用编译时间换取更高效的机器码
4.Beast mode
1)函数内联:将被调用函数的函数体(callee)的副本替换到调用位置(caller) 上, 同时重写代码以反映参数的绑定。
Beast mode:调整函数内联的策略,使更多函数被内联
2)逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问
Beast mode:函数内联拓展了函数边界,更多对象不逃逸
小结
本课程比较偏理论和底层,以往的学习中编译原理和JVM有接触过类似的知识。