Go 服务开发高手课
徐逸
头部大厂资深 Go 技术专家、前腾讯资深工程师
718 人已学习
新⼈⾸单¥59
Go 服务开发高手课
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)