这篇文章主要给大家介绍了关于 Go 语言学习技巧之如何合理使用 Pool 的相关资料, 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
来源: http://www.phperz.com/article/18/0222/362583.html