GoLang sync.Pool简介与用法
(相关资料图)
目录
使用场景使用方法声明对象池Get & Put性能测试使用场景
一句话总结:保存和复用临时对象,减少内存分配,降低GC压力
sync.Pool
是可伸缩的,也是并发安全的,其大小仅受限于内存大小。sync.Pool
用于存储那些被分配了但是没有使用,而未来可能会使用的值。这样就可以不用再次经过内存分配,可直接复用已有对象,减轻GC的压力,从而提升系统性能。
使用方法
声明对象池
type Student struct { Name string Age int32 Remark [1024]byte } func main() { var studentPool = sync.Pool{ New: func() interface{} { return new(Student) }, } }
Get & Put
type Student struct { Name string Age int32 Remark [1024]byte } var buf, _ = json.Marshal(Student{Name: "lxy", Age: 18}) func Unmarsh() { var studentPool = sync.Pool{ New: func() interface{} { return new(Student) }, } stu := studentPool.Get().(*Student) err := json.Unmarshal(buf, stu) if err != nil { return } studentPool.Put(stu) }
Get()
用于从对象池中获取对象,因为返回值是interface{}
,因此需要类型转换Put()
则是在对象使用完毕之后,返回对象池
性能测试
以下是性能测试的代码:
package benchmem import ( "encoding/json" "sync" "testing" ) type Student struct { Name string Age int32 Remark [1024]byte } var buf, _ = json.Marshal(Student{Name: "lxy", Age: 18}) var studentPool = sync.Pool{ New: func() interface{} { return new(Student) }, } func BenchmarkUnmarshal(b *testing.B) { for n := 0; n < b.N; n++ { stu := &Student{} json.Unmarshal(buf, stu) } } func BenchmarkUnmarshalWithPool(b *testing.B) { for n := 0; n < b.N; n++ { stu := studentPool.Get().(*Student) json.Unmarshal(buf, stu) studentPool.Put(stu) } }
输入以下命令:
go test -bench . -benchmem
以下是性能测试的结果:
goos: windows
goarch: amd64
pkg: ginTest
cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
BenchmarkUnmarshal-8 17004 74103 ns/op 1392 B/op 8 allocs/op
BenchmarkUnmarshalWithPool-8 17001 71173 ns/op 240 B/op 7 allocs/op
PASS
ok ginTest 3.923s
在这个例子中,因为 Student 结构体内存占用较小,内存分配几乎不耗时间。而标准库 json 反序列化时利用了反射,效率是比较低的,占据了大部分时间,因此两种方式最终的执行时间几乎没什么变化。但是内存占用差了一个数量级,使用了 sync.Pool
后,内存占用仅为未使用的 240/1392 = 1/6
,对 GC 的影响就很大了。
我们甚至在fmt.Printf
的源码里面也使用了sync.Pool
进行性能优化!
到此这篇关于GoLang sync.Pool简介与用法的文章就介绍到这了,更多相关GoLang sync.Pool内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
责任编辑:宋璟
-
GoLang sync.Pool简介与用法
-
全球通讯!河北省今年中考6月21日、22日进行 94.1万人报名
-
【当前热闻】共话中国经济新机遇丨专访:中国市场不仅是销售市场更是创新的先锋市场——访德国宝马集团大中华区总裁兼首席执行官高乐
-
浅蓝色细支阿诗玛多少一包_蓝色阿诗玛一包价格多少钱-焦点观察
-
哪些准妈妈不适合吃粽子?
-
当前焦点!京沪高铁董秘回复: 公司运输生产状态正常
-
港股异动 | 鸿腾精密(06088)跌超6%创年内新低 高盛称公司当前估值过高 下调其目标价至1.13港元 当前信息
-
视频丨5年期以上LPR下降10个基点 100万元房贷30年减少2.1万元
-
当前视点!年内房贷首次降息 专家建议推进需求端“降成本”
-
上汽集团拟斥资60亿元投资上汽芯聚 助推汽车芯片国产化|环球观天下
-
“利率4% 20万元起存” 这些银行部分大额存单火了!这类产品也卖爆了 释放什么信号?
-
每日快看:2023《火影忍者手游》6月20日每日一题答案分享
-
世界球精选!南非教授点赞办税厅“双语服务”
-
掀起SUV新风暴!比亚迪宋 PLUS 冠军版15.98 万元起售
-
藜麦怎么吃_藜麦-每日播报
-
深切著白(关于深切著白介绍)
-
九阳总部在哪里上市_九阳总部在哪里_环球报资讯
-
瓷片切割工具_瓷片_世界热推荐
-
当前报道:非白酒板块6月19日跌1.6%,张 裕A领跌,主力资金净流出2.25亿元
-
夏日时髦穿搭指南,学起来
-
10余家车企公示在售车型碳足迹
-
当前动态:《别叫我“赌神”》北京首映,周润发这次为爱发电
-
当前快报:业绩快报与年报存差异,聚石化学连续两年收年报问询函,标的公司业绩情况再被问及
-
每日信息:去有风的地方,听一曲中国古典音乐的“活化石”
-
“拍瓜师”火了!每天拍瓜上万个,听声即可辨生熟_全球新视野
-
【当前独家】守法知礼 安全出行——独山举办保障基层公务出行专项领域建设工作第一期业务培训会
-
每日热门:安集科技(688019.SH):询价转让价格为156.68元/股
-
《中餐厅》已经开录,女嘉宾被吐槽毫无亮点,全部都是关系户!_速读
-
天天即时:转会1+1:英超劲旅准备再次报价蓝军中卫 皇马宣布租借西班牙国脚
-
每日快播:可川科技:计划与自然人吕志远签署《英特磊半导体技术(上海)股份有限公司之股东协议》 共同发起设立英特磊
-
个人要如何查询自己的医保卡缴费明细呢 自己的医保缴费记录在哪可以查?_世界热点
-
港股收评:恒生科技指数跌1.3%,石油股、AIGC概念股涨幅居前,CXO概念股、内房股等板块走势低迷
-
润童园母婴护理师测评 为产妇和新生儿提供个性化护理方案|世界快看点
-
均美汇的每一位企业家都认为中名联书画培训实现免费学习书画还赚钱的梦想。
-
全球讯息:贪污受贿472万余元!原富蕴县科技局局长被检方以贪污罪、受贿罪、非国家工作人员受贿罪提起公诉