当前位置: 首页 > 编程笔记 >

Go语言学习技巧之如何合理使用Pool

司马昕
2023-03-14
本文向大家介绍Go语言学习技巧之如何合理使用Pool,包括了Go语言学习技巧之如何合理使用Pool的使用技巧和注意事项,需要的朋友参考一下

前言

Go 1.3 的sync包中加入一个新特性:Pool。

这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。

type Pool 
func (p *Pool) Get() interface{} 
func (p *Pool) Put(x interface{}) 
New func() interface{} 

垃圾回收一直是Go语言的一块心病,在它执行垃圾回收的时间中,你很难做什么。

垃圾回收压力大的服务中,GC占据的CPU有可能超过2%,造成的Pause经常超过2ms。垃圾严重的时候,秒级的GC也出现过。

如果经常临时使用一些大型结构体,可以用Pool来减少GC。

示例代码

package main
import (
 "fmt"
 "sync"
 "time"
)
type structR6 struct {
 B1 [100000]int
}
var r6Pool = sync.Pool{
 New: func() interface{} {
 return new(structR6)
 },
}
func usePool() {
 startTime := time.Now()
 for i := 0; i < 10000; i++ {
 sr6 := r6Pool.Get().(*structR6)
 sr6.B1[0] = 0
 r6Pool.Put(sr6)
 }
 fmt.Println("pool Used:", time.Since(startTime))
}
func standard() {
 startTime := time.Now()
 for i := 0; i < 10000; i++ {
 var sr6 structR6
 sr6.B1[0] = 0
 }
 fmt.Println("standard Used:", time.Since(startTime))
}
func main() {
 standard()
 usePool()
}

一个含有100000个int值的结构体,在标准方法中,每次均新建,重复10000次,一共需要耗费193ms;

如果用完的struct可以废物利用,放回pool中。需要新的结构体的时候,尝试去pool中取,而不是重新生成,重复10000次仅需要693us。

这样简单的操作,却节约了99.65%的时间,也节约了各方面的资源。最重要的是它可以有效减少GC CPU和GC Pause。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍GO 语言学习指南,包括了GO 语言学习指南的使用技巧和注意事项,需要的朋友参考一下 1.导入包,一个主函数中只有一个main函数,包含一个main包,主函数中我们要申明main的包! 2.引入包文件,譬如我们使用的是fmt包,打印helloword用,golang有一个包可见性的定义,就譬如其他语言中的private 、protected这些声明。当手写字母是小写的就是包内可用,包

  • 本文向大家介绍易语言API高级技巧教学,包括了易语言API高级技巧教学的使用技巧和注意事项,需要的朋友参考一下 首先声明,本文的读者该卖是:具有相当的易言语基础的、能较熟练地把常用的的API从VB/C声明转换到易言语DLL命令的易言语喜欢者。 1,使用指针 易言语中出于安定、方便考虑,没有直接提供指针,这正在进行一些高级 纵时不是很方便,固然有一些第三方支撑库可以取出变量指针(比如我的eLib++

  • 入门书籍 C语言开发入门教程 视频链接:https://pan.baidu.com/s/1c1Yjr80 密码: idtn 答案链接:http://pan.baidu.com/s/1hsbk2tm 密码:g81c 源码链接:http://pan.baidu.com/s/1jHL7up4 密码:hafs 题库链接:http://pan.baidu.com/s/1c17604g 密码:vqfw 方案链

  • 本文向大家介绍Go语言使用字符串的几个技巧分享,包括了Go语言使用字符串的几个技巧分享的使用技巧和注意事项,需要的朋友参考一下 一、字符串底层就是一个字节数组 这真的非常重要,而且影响着下面的其他几个技巧。当你创建一个字符串时,其本质就是一个字节的数组。这意味着你可以像访问数组一样的访问单独的某个字节。例如,下面的代码逐个打印字符串中的每个字节以及对应字节数组中的每个字节: 这是一个很重要的知识,

  • 本文向大家介绍jQuery学习笔记之2个小技巧,包括了jQuery学习笔记之2个小技巧的使用技巧和注意事项,需要的朋友参考一下 1.jQuery功能函数前缀 在javascript中,开发者通常会编写一些小函数来处理各种操作细节,例如在用户提交表单时,要将文本框最前端和最末端的空格内容清理掉。而javascript中没有类似trim()功能,在师院jQuery后,便可以使用trim()函数。 tr

  • 本文向大家介绍Go语言中的Slice学习总结,包括了Go语言中的Slice学习总结的使用技巧和注意事项,需要的朋友参考一下 概念 Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组