前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >避免Goroutine频繁创建来提高性能

避免Goroutine频繁创建来提高性能

作者头像
Linker
发布2018-04-13 16:17:56
1.8K1
发布2018-04-13 16:17:56
举报
文章被收录于专栏:高性能分布式系统设计

频繁的创建和销毁goroutine带来的开销不仅仅是goroutine创建和销毁本身.

更大的开销是由于goroutine的Stack一开始只有2KB, 而大部分复杂的业务都需要更多的Stack.

新创建goroutine, 还需要付出频繁扩展Stack的成本. 这个成本是巨大的.

如果最终需要128KB的栈,那么要扩6次stack. 期间需要复制和检查Stack当中的数据, 开销巨大.

以下的代码,可以把创建goroutine改成一个简单的入chan操作, 同时也避免的扩展Stack的操作, 成本就降低了很多.

代码语言:javascript
复制
var resolvers chan func()

func init() {
   resolvers = make(chan func(), 100)
   var f func()
   f = func() {
      defer f()
      j := <-resolvers
      j()
   }
   for i := 0; i < 100; i++ {
      go f()
   }
}

使用的代码如下:

代码语言:javascript
复制
resolvers <- func() {
   L(xxxx) // 这里是示意代码
}

----------------

Go语言的goroutine初始栈大小只有2K,如果运行过程中调用链比较长,超过的这个大小的时候,栈会自动地扩张。这个时候会调用到一个函数runtime.morestack。开一个goroutine本身开销非常小,但是调用morestack进行扩栈的开销是比较大的。想想,如果函数的栈扩张了,有人引用原栈上的对象怎么办?所以morestack的时候,里面的对象都是需要调整位置的,指针都要重定位到新的栈。栈越大,涉及到需要调整的对象越多,调用morestack的时候开销也越大。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档