时间:2021-05-22
前言
Go 1.3 的sync包中加入一个新特性:Pool。
这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。
垃圾回收一直是Go语言的一块心病,在它执行垃圾回收的时间中,你很难做什么。
在垃圾回收压力大的服务中,GC占据的CPU有可能超过2%,造成的Pause经常超过2ms。垃圾严重的时候,秒级的GC也出现过。
如果经常临时使用一些大型结构体,可以用Pool来减少GC。
示例代码
package mainimport ( "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。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述我们已经知道Go语言提供了sync.Pool,但是做的不怎么好,所以有必要自己来实现一个pool。给我看代码:复制代码代码如下:typePoolstruct
本篇不是教给大家如何去学习python,有需要详细深入学习的朋友可以参阅:Python基础语言学习笔记总结(精华)本文通过一周快速学习python入门知识总计了
前言之前有一篇介绍如何使用Go语言通过SSH协议来执行远程命令:如何使用Go语言实现远程执行命令同样,通过SSH协议也可以使用Go语言来远程传输文件。除了SSH
说明:之前学习过go语言(大概是0.9版本),后来更新太快,也没怎么使用,就荒废掉了,今年有项目需要用go开发,重新捡起。这是我在学习go语言过程中整理的内容,
如果你从Ruby或者Python转型到Go,将会有很多语言差异需要学习,其中很多问题都是围绕处理string类型。下面是一些字符串的技巧,这些技巧解决了我在使用