05|单机吞吐优化(三):科学复用对象和协程资源
徐逸

你好,我是徐逸。
上节课我们学习了几个高性能数据处理的技巧,它们能有效降低单个请求对 CPU 和内存资源的消耗,提升单机吞吐。
今天呢,咱们来聊聊另一种优化技巧 —— 资源复用。当我们在处理请求的时候,对于用完的临时对象或者协程,可以不立马销毁,而是把它存起来。等到处理其他请求的时候,我们可以直接复用之前创建好的对象或者协程。这样可以避免频繁地创建和销毁消耗 CPU,让更多的 CPU 资源用于运行业务逻辑代码,提升单机吞吐。
在我开始讲具体的资源复用技巧之前,你可以先琢磨一下,要是我们不停地创建临时对象,Golang 运行时的哪些操作会消耗 CPU 资源呢?
对象池:如何避免频繁分配相同类型临时对象的开销?
实际上,如果频繁创建临时对象的话,Golang 运行时会在下面这两个操作上产生较大的开销。
首先是内存分配。我们不停地创建对象时,就得不断地在堆里面找空闲的内存块,然后进行分配。这就像是在一个大仓库里,每次创建新对象都要重新找地方放,这个过程是很消耗资源的。
再就是垃圾收集(GC)。要是临时对象很多,那在进行垃圾收集的时候,就需要耗费更多的 CPU 资源去扫描这些对象,看看哪些没用了,然后清理掉。这就像大扫除的时候,如果杂物太多,打扫起来就会更费劲。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. 频繁创建临时对象会在内存分配和垃圾收集方面产生较大的开销,通过火焰图验证了这一点。 2. 使用对象池可以避免频繁分配相同类型临时对象的开销,减少内存分配和垃圾收集的开销。 3. Golang中的sync.Pool类型支持对象池,通过Get和Put方法实现从池里取出临时对象和放回池里。 4. 对象池的使用能够明显提升性能,减少CPU资源消耗和内存消耗。 5. 对象池在Golang标准库中有广泛应用,如fmt.Printf()函数的底层实现中就会调用对象池来获取和释放临时对象。 6. 通过对象池的使用,平均单次请求从堆中分配的大小和次数直接变成了0,节约了大量的CPU资源。 7. 使用对象池的方式,单次函数调用的CPU资源消耗大幅减少,节约了约86%的CPU资源。 8. 频繁创建协程会带来内存分配和协程调度方面的开销,通过火焰图验证了这一点。 9. 使用协程池可以避免频繁创建协程,减少内存分配和协程调度的开销,提升性能. 10. gopool是一个高性能的协程池,能够实现协程的复用,并且可以对协程的最大数目加以限制。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 服务开发高手课》,新⼈⾸单¥59
《Go 服务开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论