当对象较大的时候才使用pool

逃逸分析

在编译原理中,分析指针动态范围的方法称之为逃逸分析。他是编译器执行静态代码分析后,对内存管理进行的优化和简化。

堆与栈

程序会从操作系统申请一块内存,而这块内存也会被分成堆和栈。可以通过编译器的逃逸分析判断。

堆上动态分配内存比栈上静态分配内存开销大得多。

变量分配在栈上需要能在编译期确定它的作用域,否则会分配到堆上。临时变量一般分配在栈上,但是大小过大或者大小不确定的也会分配到堆上。

编译器会根据变量是否被外部引用来决定是否逃逸。对于go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags -m命令来观察变量逃逸情况。尽量少写一些逃逸的代码,提升程序的运行效率。

不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸分析后动态地在堆上分配内存少得多。

Pool

只有当每个对象占用内存较大的时候,用Pool才会改善性能

使用Pool要在Put之前重置,在Get之后重置

参考

3.5. 临时对象池(Pool)

Golang之变量去哪儿?

最后更新于

这有帮助吗?