首页 > 其他分享 >​sync.Pool 使用

​sync.Pool 使用

时间:2022-10-09 15:05:16浏览次数:59  
标签:sync stu json Student 使用 Pool op

sync.Pool 使用场景

保存和复用临时对象,减少内存分配,降低 GC 压力

例子

type Student struct {
Name string
Age int32
Remark [1024]byte
}

var buf, _ = json.Marshal(Student{Name: "Geektutu", Age: 25})

func unmarsh() {
stu := &Student{}
json.Unmarshal(buf, stu)
}

json 反序列化在文本解析和网络通信过程中十分常见,当程序并发很高时,短时间内需要创建大量的临时变量,,这些对象分配在堆上,会给 GC 造成很大压力,严重影响程序性能。

sync.Pool 是可伸缩的,同时也是并发安全的,大小受限于内存大小。sync.Pool 用于存储那些被分配了但是没有被使用,但是未来可能被使用的值。这样可以不用再次分配内存,提高效率。

sync.Pool 是大小可伸缩的,高负载时会动态扩容,存放在池中对象不活跃会被自动清理。

如何使用

声明对象池

只要实现 New 函数即可,对象池中没有对象,那么会调用 New 函数创建

var studentPool = sync.Pool{
New: func() interface{} {
return new(Student)
},
}

Get& Put


stu := studentPool.Get().(*Student)
json.Unmarshal(buf, stu)
studentPool.Put(stu)
  • Get() 用于从对象池中获取对象,因为返回值时 interface{} 因此需要值类型转换
  • Put() 则是在对象使用完之后放回对象池

struct 性能测试

package sync

import (
"encoding/json"
"sync"
"testing"
)

type Student struct {
Name string
Age int32
Remark [1024]byte
}

var studentPool = sync.Pool{New: func() interface{} {
return new(Student)
}}

var buf, _ = json.Marshal(Student{Name: "Geektutu", Age: 25})

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: darwin
goarch: amd64
pkg: code.byted.org/wangmingming.hit/GoProject/main/gobase/sync
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkUnmarshal-12 13280 94006 ns/op 1384 B/op 7 allocs/op
BenchmarkUnmarshalWithPool-12 12662 95211 ns/op 232 B/op 6 allocs/op
PASS

BenchmarkUnmarshal 每个循环用了 94006 纳秒,

结果项

含义

BenchmarkUnmarshal-12

BenchmarkUnmarshal 是测试的函数名 -12 表示GOMAXPROCS(线程数)的值为12

13280

表示一共执行了13280次,即b.N的值

94006.0 ns/op

表示平均每次操作花费了94006.0纳秒

1384/op

表示每次操作申请了1384 Byte的内存申请

7 allocs/op

表示每次操作申请了7次内存

可以看到 使用 sync.Pool 后,内存占用仅为未使用的 232/1384.

欢迎关注公众号:程序员开发者社区

​sync.Pool 使用_对象池


参考资料


标签:sync,stu,json,Student,使用,Pool,op
From: https://blog.51cto.com/u_15683090/5740469

相关文章

  • Js的Promise、Generator,Async/await 区别
    我们知道JavaScript是单线程语言,如果没有异步编程非得卡死。以前,异步编程的方法有下面四种回调函数事件监听发布/订阅Promise对象现在据说异步编程终极解决方案是—......
  • webpack使用
    一、概述模块化和打包 Webpack是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。从图中我们可以看......
  • npm使用
    一、简介1、什么是NPMNPM全称NodePackageManager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于前端的Maven......
  • 使用IDEA 打包项目的问题
     关于打包的问题,网上也是有很多帖子,真的都很不好用,如果IDEA 的版本不一致,也是不能用。这个还是比较好用的方式的。##将程序打成jar包,并且可运行。 确保依赖没有问题,......
  • pyquery使用
    frompyqueryimportPyQueryaspqfromlxmlimportetreeimporturllib#d=pq("<html></html>")#d=pq(etree.fromstring("<html></html>"))#d=pq(url=your_url)#d=pq(......
  • linux环境变量配置错误后命令无法使用解决方案
    环境变量配置时多复制了一个空格,导致执行source/etc/profile后提示错误,无法编辑和查看文件解决方案: 查看当前系统变量:echo$PATH临时修改:exportPATH=/usr/local/sbi......
  • 开发人员使用Klocwork实现软件安全的5大原因
    Klocwork是为企业DevOps和DevSecOps而生的,因为Klocwork能够在保持高开发速度的同时,确保在安全和质量方面的持续合规,所以是企业首选的静态分析和SAST工具。在这里,我们将分享......
  • 分享一个查看分析Oracle表空间使用情况的脚本
    个人一直使用下面这个脚本查看、分析Oracle数据库表空间的使用情况,这个脚本经过我不断的调整、完善,已经接近完美了。已经很长时间没有改动过了,个人累积的脚本名为get_table......
  • spring boot项目使用mybatis-plus代码生成实例
    前言mybatis-plus官方地址https://baomidou.commybatis-plus是mybatis的增强,不对mybatis做任何改变,涵盖了代码生成,自定义ID生成器,快速实现CRUD,自动分页,逻辑删除等功能......
  • synchronized、ReentrantLock、LockSupport 的使用
    synchronized线程等待唤醒机制privatestaticfinalObjectobjLock=newObject();publicstaticvoidmain(String[]args){newThread(()->{......