首页>>后端>>Golang->高性能 Go 语言发行版优化与落地实践 | 青训营笔记

高性能 Go 语言发行版优化与落地实践 | 青训营笔记

时间:2023-12-01 本站 点击:0

一、自动内存管理

1.1 概念

动态内存:程序在运行时根据需求动态分配内存 自动内存管理(垃圾管理):由程序的运行时系统管理动态内存三个任务:

为新对象分配空间

找到存活对象

回收死亡对象的内存空间自动内存管理-相关概念

GC算法指标

追踪垃圾回收

分代GC

引用计数的优缺点

二、Go内存管理及优化

2.1 Go内存分配

2.1.1 分块

目标:为对象在heap上分配内存 分成的块称作mspanmspan类型 GC不需要扫描:noscan mspan:分配不包含指针的对象 GC需要扫描:scan mspan:分配包含指针的对象 注:根据对象的大小,选择最合适的块返回

2.1.2 缓存

2.2 Go内存管理优化

对象分配是非常高频的操作:每秒分配GB级别的内存

小对象占比较高

Go内存分配比较耗时 有一个路径g->m->p->... (mallocgc:用于对象分配内存) Banlanced GC

总结

三、编译器和静态分析

3.1 基本介绍

3.2 数据流和控制流

3.3 过程内和过程间分析

过程内分析:仅在函数内部进行分析过程间分析:考虑函数调用时参数传递和返回值的数据流和控制流

四、GO编译器优化

编译优化的思路:

场景:面向后端长期执行任务

Tradeoff:用编译时间换取更高效的机器码

4.1 函数内联

内联:将被调用函数的函数体的副本替换到调用位置上,同时重写代码以反映参数的绑定。 优点:

消除函数调用开销,例如传递参数

将过程间分析转化为过程内分析,帮助其他优化,例如逃逸分析 缺点:

函数体变大

编译生成的Go的镜像变大 函数内联在大多数情况下是正向优化 内联策略 ...

4.2 逃逸分析

逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问 Beast Mode:函数内联拓展了函数边界,更多对象不逃逸 优化:未逃逸的对象可以在栈上分配

对象在栈上分配和回收很快:移动sp

减少在heap上的分配,降低GC负担

五、课程总结

高性能Go语言发行版优化与落地实践 性能优化:

自动内存管理

Go内存管理

编译器与静态分析

编译器优化

实践:

Banlanced GC 优化对象分配

Beast Mode提升代码性能

分析问题的解决方法与解决问题的思路,不仅适用于Go语言,其他的语言优化也同样适用。

六、参考文献

原文:https://juejin.cn/post/7097559335101792270


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/5871.html