首页 > 其他分享 >go使用sync.Pool的性能对比

go使用sync.Pool的性能对比

时间:2022-12-20 11:24:13浏览次数:40  
标签:++ sync person Pool go pool

在业务代码编码中,涉及到经常用前创建,用后销毁的资源,为了提高性能,减少内存分配,减轻GC压力,自然而然地就会联想到使用对象池的应用。

go在很多方面都有着sync.Pool的应用,我们经常使用的fmt.Println("balabala"),其实也用到了sync.Pool,不信可以自己去阅读源码。

之前在用gin重构项目代码时,学习到gin.Context在处理新请求的时候,也是用到了sync.Pool复用context,减少内存分配,今天我们来看看使用sync.Pool和不用sync.Pool的的性能对比测试。

sync.Pool的使用其实也比较简单,

  • 1.创建对象池
  • 2.用时Get
  • 3.用完Put

不说废话,看代码:

package syncpool

import (
	"sync"
	"testing"
)

type person struct {
	age int
}

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

// no pool
func BenchmarkWithoutPool(b *testing.B) {
	var p *person
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for j := 0; j < 10000; j++ {
			p = new(person)
			p.age = 23
		}
	}
}

// pool
func BenchmarkWithPool(b *testing.B) {
	var p *person
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		for j := 0; j < 10000; j++ {
			p = personpool.Get().(*person)
			p.age = 23
			personpool.Put(p)
		}
	}
}

以下是测试结果:

从测试结果看,确实遇到需要频繁创建对象的场景,如果用了sync.Pool对象池,结果竟然相差那么大,比如性能上,用pool的操作耗时几乎是不用pool的50%,而在内存分配上,由于pool复用对象,更是做到了0分配,说明sync.Pool的使用可以大大优化我们的代码,遇到相应的开发场景还不用上呢!

标签:++,sync,person,Pool,go,pool
From: https://www.cnblogs.com/davis12/p/16993786.html

相关文章

  • macOS 应用多开 Google Chrome 应用分身 All In One
    macOS应用多开GoogleChrome应用分身AllInOneGoogleChrome浏览器副本macOSChrome应用分身新建用户数据存放目录#软连接?WindowsChrome应用分身右......
  • Golang glog使用详解
    ​​golang/glog​​​ 是C++版本 ​​google/glog​​ 的Go版本实现,基本实现了原生glog的日志格式。在Kuberntes中,glog是默认日志库。glog的使用与特性通用功......
  • 最小二乘法 good
    最小二乘法也称为最小平方法,是一种数据优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。最小二乘法最初由高尔顿在创立回归分析的时候提出,现在已经成为探索变量间......
  • mongodb数据库修复 mongodb数据库丢失恢复 mongodb数据库数据恢复 mongodb数据库文件0
    mongodb数据库修复mongodb数据库丢失恢复mongodb数据库数据恢复mongodb数据库文件0kb数据恢复客户名称保密数据类型mongodb3.0数据容量20GB故障类型强制重启服务器......
  • go正则
    常用方法,实话说没有python的正则丰富packagemainimport("fmt""regexp")funcmain(){reg,_:=regexp.Compile("[1,3,5,8,6]{3}[0-9]{8}")r......
  • django框架(七)
    (3)Q查询进阶操作研究查询条件的左边是什么?字段名还是变量名?models.Book.objects.filter(pk=1)发现是变量名如果想让左边不是变量名而是字段名,则需要用到Q查询Q:还可......
  • macOS 13 彻底卸载 Google Chrome 和清除用户数据 All In One
    macOS13彻底卸载GoogleChrome和清除用户数据AllInOnebug/Users/xgqfrms-mm/Library/Users/xgqfrms-mm/Library/Caches#“~/Library/Caches”$pwd/Users/x......
  • 利用log4j+mongodb实现分布式系统中日志统
    背景   在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出。为了方便对这些日志进行统一管理和分析。我们可以将......
  • Django之Ajax
    什么是Ajax?ajax全名:asyncjavascriptandXML(异步JavaScript和XML)是前后台交互的能⼒,也就是我们客户端给服务端发送消息的⼯具,以及接受响应的⼯具AJAX不是新......
  • go语言的变量
    Go语言是一种静态类型的编程语言变量的定义变量的定义用var关键字varnametypevarnamestring="zhangsan"变量的赋值短变量的声明并初始化//:=自动推导 na......