iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GoLangsync.Pool简介与用法
  • 919
分享到

GoLangsync.Pool简介与用法

GoLangsync.PoolGoLangsync.Pool底层原理 2023-01-02 15:01:26 919人浏览 安东尼
摘要

目录使用场景使用方法声明对象池Get & Put性能测试使用场景 一句话总结:保存和复用临时对象,减少内存分配,降低GC压力 sync.Pool是可伸缩的,也是并发安全的,其

使用场景

一句话总结:保存和复用临时对象,减少内存分配,降低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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GoLangsync.Pool简介与用法

本文链接: https://www.lsjlt.com/news/176424.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GoLangsync.Pool简介与用法
    目录使用场景使用方法声明对象池Get & Put性能测试使用场景 一句话总结:保存和复用临时对象,减少内存分配,降低GC压力 sync.Pool是可伸缩的,也是并发安全的,其...
    99+
    2023-01-02
    GoLang sync.Pool GoLang sync.Pool底层原理
  • Java Selenide 简介与用法
    目录Selenide 介绍什么是selenium官方快速入门元素定位元素操作浏览器操作断言常用配置Selenide 和 Webdriver 对比Selenide 介绍 Seleni...
    99+
    2024-04-02
  • PyTorch中torch.utils.data.DataLoader简单介绍与使用方法
    目录一、torch.utils.data.DataLoader 简介二、实例参考链接总结一、torch.utils.data.DataLoader 简介 作用:torch.utils...
    99+
    2024-04-02
  • PMM--简介与部署
    Percona Monitoring and Management是percona一款开源的用于管理和监控MySQL 和MongoDB性能的开源平台,通过PMM客户端收集到的DB监控数据用第三方软件Grafana画图展示出来,包括两个部分:...
    99+
    2023-01-31
    简介 PMM
  • Mybatis 简介与原理
    什么是MybatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“...
    99+
    2023-05-31
    mybatis batis
  • Class.forName()用法简介说明
    Class.forName()是Java反射机制中的一个方法,它的作用是根据类的全限定名(包括包名和类名)动态加载类,返回对应的Cl...
    99+
    2023-09-09
    用法
  • DataSource与数据库连接池简介(JDBC简介)
    目录起源为何放弃DriverManager连接池数据源实现核心架构DataSourceAPI小结应用数据库连接池示例总结DataSource是作为DriverManager的替代品而...
    99+
    2022-11-13
    数据库连接池Data Source JDBC数据库连接池Data Source
  • Golang简介与基本语法的学习
    目录一、什么是Golang?二、安装Golang三、编写Hello World程序四、基本语法4.1 变量4.2 数组和切片4.3 控制流五、并发编程一、什么是Golang? Gol...
    99+
    2023-05-16
    Golang简介 Golang基本语法
  • MongoDB数据库简介与安装方法
    1、简介 MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。旨在为WEB应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,添加更多的节点(分布式)...
    99+
    2024-04-02
  • python3的安装与简介
    Python安装(linux)1 安装python3.6可能使用的依赖     #yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel ...
    99+
    2023-01-31
    简介
  • Python--状态码的简介与获取方法
    一、网页HTTP状态码       HTTP状态码表示HTTP协议所返回的响应状态。       HTTP状态码有5种,所有状态码的第一个数字代表了响应的5种状态之一:(1)消息:1XX;(2)成功:2XX;(3)重定向:3XX;(4)请...
    99+
    2023-01-31
    状态 简介 方法
  • C#线程池ThreadPool用法简介
    目录一、ThreadPool概述线程池使用起来很简单,但它有一些限制使用线程池线程的操作的情况包括二、方法三、设置和获取线程数方法四、将方法排入队列以便执行:QueueUserWor...
    99+
    2024-04-02
  • AndroidToolbar应用栏使用方法简介
    目录一、概念二、使用2.1 xml2.2 menu2.3 Manifest2.4 Activity一、概念 默认显示的 ActionBar 来自于主题指定(Manifest中appl...
    99+
    2022-12-08
    Android Toolbar Android Toolbar应用栏
  • WebSocket简介与消息推送
    目录一、Socket简介TCP/IP协议UDP协议二、WebSocket简介与消息推送三、WebSocket客户端四、WebSocket服务器端五、测试运行六、小结与消息推送框架6....
    99+
    2024-04-02
  • WPF简介与基础开发
    一、WPF简介 WPF:WPF即Windows Presentation Foundation,翻译为中文“Windows呈现基础”,是微软推出的基于Wind...
    99+
    2024-04-02
  • 阿里云数据库Redis简介与应用
    阿里云数据库Redis是一种高性能、内存型数据库,提供快速读写和高可用性。它支持多种数据结构,如字符串、哈希表、列表等,适用于各种应用场景。本文将详细介绍阿里云数据库Redis的特点和使用方法,并通过实际案例来展示其在不同业务场景下的应用...
    99+
    2024-01-20
    阿里 数据库 简介
  • MobaXterm简介与使用(连接Linux服务器)
    一、MobaXterm简介 MobaXterm 是用于远程计算的工具箱,作为一个 Windows 应用程序,它为程序员、网站管理员、IT管理员和几乎所有需要以更简单的方式处理远程工作的用户量身定制了大量功能。MobaXterm 提供了所有重...
    99+
    2023-09-05
    服务器 linux 深度学习 MobaXterm
  • python编程PyAutoGUI库使用与安装简介
    如何通过python代码解放双手,或者通过代码实现自动的电脑鼠标or键盘操作呢?  python的PyAutoGUI库是一个很好地选择。 首先根据下面这个网址下载PyAut...
    99+
    2024-04-02
  • jQuery中bind的用法简单介绍
    jQuery中的bind()方法用于将一个处理函数绑定到指定的元素上,该处理函数将在特定事件触发时被调用。bind()方法的基本语法如下:```javascript$(selector).bind(event, data, handle...
    99+
    2023-08-09
    jQuery
  • Java中StringTokenizer的用法简介汇总
    目录StringTokenizer的用法StringTokenizer 构造方法:StringTokenizer 常用方法:补充:下面在介绍下StringTokenizer的使用下文...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作