当前位置: 首页 > news >正文

go-基于逃逸分析来提升性能程序

go-基于逃逸分析来提升性能程序

为什么要学习逃逸分析:

为了提高程序的性能,通过逃逸分析我们能知道指标是分配到堆上还是栈上,如何是 分配到栈上,内存的分配和释放都是由编译器进行管理的,分配和释放的速度都非常的快;如果分配到堆上,堆不像栈那样可以自动清理,它会引起崩溃进而进行垃圾回收,而垃圾回收又会占用比较大的系统开销。

什么是逃逸分析

逃逸分析简单来说就是分析在程序的哪些位置可以访问到该指针

简单的来说,它是在对变量放在堆上或者栈上进行分析,该分析在编译阶段完成。如果一个变量超过了函数调用的生命周期,那么这个变量就在函数外部存在引用了,编译器会把这个变量分配到堆上,接下来我们就说这个变量发生逃逸了。

如何确定是否逃逸

go run -gcflags '-m' main.go

可能出现逃逸的场景

pakcage main type Student struct {Name interface{}}func main() {stu := new(Student)stu.Name = "tom"}
  • 函数main可以被内联(can inline main)。
  • 在第45行,new(Student)函数调用没有逃逸到堆上分配(does not escape)。
  • 在第46行,字符串"tom"逃逸到了堆上分配(escapes to heap)。

interface赋值会发生逃逸,优化方案只需要将类型设置为固定类型,例如:string

02

package main type Student struct {Name string
}func GetStudent() *Student {stu := new(Student)stu.Name = "tom"return stu
}func main() {GetStudent()
}
  • 函数GetStudent可以被内联(can inline GetStudent)。
  • 函数main可以被内联(can inline main)。
  • 在第55行,new(Student)函数调用逃逸到堆上分配(escapes to heap)。
  • 在第61行,new(Student)函数调用没有逃逸到堆上分配(does not escape)。
  • 在第61行,调用GetStudent函数被内联(inlining call to GetStudent)。

返回指针类型,会发生逃逸

函数传递指针和传值,传递指针可以减少底层值的拷贝,可以提高效率,但是如果拷贝的数据量小,由于指针传递会产生逃逸,可能会使用堆,也可能会增加GC的负担,所以交付负载不一定是高效的。

不要盲目使用指针作为参数,虽然减少了复制,但指针逃逸的头部可能更大

package mainfunc main() {nums := make([]int, 10000, 10000)for i := range nums {nums[i] = i}
}
  • 函数main可以被内联(can inline main)。
  • 在第66行,使用make函数创建的切片逃逸到了堆上分配(escapes to heap)

栈空间不足,发生逃逸,设置合理容量

总结
  1. 逃逸分析是编译器在静态编译时完成的
  2. 逃逸分析后可以确定哪些变量可以在分配栈上,栈的性能好
http://www.lryc.cn/news/294309.html

相关文章:

  • [软件工具]文档页数统计工具软件pdf统计页数word统计页数ppt统计页数图文打印店快速报价工具
  • linux编译ffmpeg动态库
  • Unity3d Cinemachine篇(完)— TargetGroup
  • 事件驱动架构:使用Flask实现MinIO事件通知Webhooks
  • 力扣面试150 只出现一次的数字Ⅱ 哈希 统计数位 DFA有穷自动机
  • R语言学习case10:ggplot基础画图Parallel Coordinate Plot 平行坐标图
  • Easy Excel动态表头的实现
  • kvm qemu 优化 windows 虚拟机速度
  • 银行数据仓库体系实践(18)--数据应用之信用风险建模
  • 每日一练 | 华为认证真题练习Day179
  • [ubuntu]add-apt-repository 添加以及移除
  • PySpark(二)RDD基础、RDD常见算子
  • 修改MFC图标
  • springboot158基于springboot的医院资源管理系统
  • 【算法】枚举——蓝桥杯、日期统计、特殊日期(位数之和)、2023、特殊日期(倍数)、跑步锻炼
  • 基于flask的个人博客项目从0到1
  • 基于OpenCV灰度图像转GCode的单向扫描实现
  • JAVA生成Word文档
  • python将.db数据库文件转成Excel文档
  • [opencvsharp]C#基于Fast算法实现角点检测
  • 群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务
  • ReactNative实现弧形拖动条
  • STM32F407移植OpenHarmony笔记9
  • telnet笔记
  • 【考研408】操作系统笔记
  • 从0开始搭建、上传npm包
  • 【Go】在 JSON 中解析 time.Duration
  • UE4 C++ UGameInstance实例化
  • 在工业制造方面,如何更好地实现数字化转型?
  • 【MySQL】-10 MySQL 存储过程