最近在工作中,频繁用到一些结构体的申请,内存会频繁的进行释放和申请,于是想尝试一下sync.pool的优化效果。
sync.pool,需要初始化 Pool,唯一需要的就是设置好 New 函数。当调用 Get 方法时,如果池子里缓存了对象,就直接返回缓存的对象。如果没有存货,则调用 New 函数创建一个新的对象。
另外,我们发现 Get 方法取出来的对象和上次 Put 进去的对象实际上是同一个,Pool 没有做任何“清空”的处理。但我们不应当对此有任何假设,因为在实际的并发使用场景中,无法保证这种顺序,最好的做法是在 Put 前,将对象清空。
对不同的数据类型,以及go官方推荐的场景尝试了pool
测试代码运行结果
===map===
no pool: 669.209138ms
pool: 150.040187ms
===string===
no pool: 755.579983ms
pool: 766.081325ms
===slince===
no pool: 7.260073ms
pool: 12.101939ms
===符合官方pool条件的结构体===
no pool: 44.480533049s
pool: 37.973930565s
结论
对于map或者自定义类型的结构体,使用pool会有较好的提升
测试代码如下:
package main
import (
"fmt"
"time"
"sync"
"math/rand"
"strconv"
)
func mapTestNoPool()time.Duration{
be:=time.Now()
for i:=0;i<100000;i++{
var aaa map[int]int=make(map[int]int)
for j:=0;