go的临时对象池--sync.Pool
2017-07-08 16:01
651 查看
一个sync.Pool对象就是一组临时对象的集合。Pool是协程安全的。
Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力。一个比较好的例子是fmt包,fmt包总是需要使用一些[]byte之类的对象,golang建立了一个临时对象池,存放着这些对象,如果需要使用一个[]byte,就去Pool里面拿,如果拿不到就分配一份。
这比起不停生成新的[]byte,用完了再等待gc回收来要高效得多。
sync.Pool有两个公开的方法。一个是Get,另一个是Put。前者的功能是从池中获取一个interface{}类型的值,而后者的作用则是把一个interface{}类型的值放置于池中。
上面代码的运行结果显示使用对象池很明显提升了性能
墙裂推荐
golang内存回收
bytepool
Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力。一个比较好的例子是fmt包,fmt包总是需要使用一些[]byte之类的对象,golang建立了一个临时对象池,存放着这些对象,如果需要使用一个[]byte,就去Pool里面拿,如果拿不到就分配一份。
这比起不停生成新的[]byte,用完了再等待gc回收来要高效得多。
type buffer []byte // pp是用于存储printer状态的一个结构体 type pp struct { buf buffer arg interface{} value reflect.Value fmt fmt reordered bool goodArgNum bool panicking bool erroring bool } //一个pp的对象池 var ppFree = sync.Pool{ New: func() interface{} { return new(pp) }, } // 分配一个新的pp或者拿一个缓存的。 func newPrinter() *pp { p := ppFree.Get().(*pp) p.panicking = false p.erroring = false p.fmt.init(&p.buf) return p }
sync.Pool有两个公开的方法。一个是Get,另一个是Put。前者的功能是从池中获取一个interface{}类型的值,而后者的作用则是把一个interface{}类型的值放置于池中。
最简单的例子
// 一个[]byte的对象池,每个对象为一个[]byte var bytePool = sync.Pool{ New: func() interface{} { b := make([]byte, 1024) return &b }, } func main() { a := time.Now().Unix() // 不使用对象池 for i := 0; i < 1000000000; i++{ obj := make([]byte,1024) _ = obj } b := time.Now().Unix() // 使用对象池 for i := 0; i < 1000000000; i++{ obj := bytePool.Get().(*[]byte) _ = obj bytePool.Put(obj) } c := time.Now().Unix() fmt.Println("without pool ", b - a, "s") fmt.Println("with pool ", c - b, "s") } // without pool 34 s // with pool 24 s
上面代码的运行结果显示使用对象池很明显提升了性能
扩展阅读
墙裂推荐golang内存回收
bytepool
相关文章推荐
- Go语言学习之sync包(临时对象池Pool、互斥锁Mutex、等待Cond)(the way to go)
- golang的临时对象池sync.Pool
- Golang 临时对象池 sync.Pool
- go语言的官方包sync.Pool的实现原理和适用场景
- [Go] sync.Pool 的实现原理 和 适用场景
- 剖析Go1.3新特性:sync.Pool
- go语言的官方包sync.Pool
- go语言sync包的学习(Mutex、WaitGroup、Cond)
- 【pool】Apache common-pool, common-dbcp源码解读与对象池原理剖析
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
- java对象池ObjectPool
- 【Todo】Apache-Commons-Pool及对象池学习
- 使用对象池(ObjectPool)方式处理子弹的发射逻辑
- 设计模式之美:Object Pool(对象池)
- 对象池与线程池(pool)
- php设计模式-对象池模式(Object pool)
- COM+ 对象池以及数据库连接池中 最小池大小 min pool size
- 对象池commons-pool框架的研究以及源代码分析(一)
- [Go] sync.Once 的用法
- Java通用对象池GenericObjectPool<T>原理总结和自定义的Jedis管理池例子