网站介绍ppt怎么做,屏蔽网站ip,桂林漓江官网,wordpress修改页面样式表go-基于逃逸分析来提升性能程序
为什么要学习逃逸分析#xff1a;
为了提高程序的性能#xff0c;通过逃逸分析我们能知道指标是分配到堆上还是栈上#xff0c;如何是 分配到栈上#xff0c;内存的分配和释放都是由编译器进行管理的#xff0c;分配和释放的速度都非常的…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 tomreturn 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
栈空间不足发生逃逸设置合理容量
总结
逃逸分析是编译器在静态编译时完成的逃逸分析后可以确定哪些变量可以在分配栈上栈的性能好