go sync.pool优化测试

本文探讨了在工作中遇到的频繁结构体申请问题,通过使用`sync.pool`进行优化。测试结果显示,对于map和自定义结构体,使用`sync.pool`能显著减少内存分配时间。文中展示了不同数据类型(如map、string、slice和自定义结构体)的测试代码及运行结果,证实了`sync.pool`在某些场景下的效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中,频繁用到一些结构体的申请,内存会频繁的进行释放和申请,于是想尝试一下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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值