Go 性能优化技巧 9/10

qyuhen · · 3718 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

作为内置类型,通道(channel)从运行时得到很多支持,其自身设计也算得上精巧。但不管怎么说,它本质上依旧是一种队列,当多个 goroutine 并发操作时,免不了要使用锁。某些时候,这种竞争机制,会导致性能问题。 下面是一个简单利用 channel 收发数据的示例,为便于 “准确” 测量收发操作性能,我们将 make channel 操作放到外部,尽可能避免额外消耗。 ![channel1](http://studygolang.qiniudn.com/160612/c4c5769a4bb13b0bfc57656464ecc3e6.jpg) 在研究 go runtime 源码实现过程中,会看到大量利用 “批操作” 来提升性能的样例。在此,我们可借鉴一下,看看效果对比。 ![channel2](http://studygolang.qiniudn.com/160612/d38cb73f1a5772642488485614a8124a.jpg) ![channel3](http://studygolang.qiniudn.com/160612/f652ee54676d3833be36290a98c4300c.jpg) ![channel4](http://studygolang.qiniudn.com/160612/e1e7201a99e5e9b962f0e0d911e2c5b8.jpg) 从测试结果看,性能提升很高,可见批操作是一种有效方案。 就此例而言,是否可以使用 slice 代替 array 块?直观上,slice 可减少通过 channel 传递的数据大小,减少数据复制,似乎可进一步提升性能。不妨做个测试。 ![channel5](http://studygolang.qiniudn.com/160612/b303f4708e34d17b8dd48a858278f6c4.jpg) ![channel6](http://studygolang.qiniudn.com/160612/3ddae2427a5b79a0a24eec9aed2a6c7b.jpg) ![channel7](http://studygolang.qiniudn.com/160612/db9906013b952f70814c0216532d7d9d.jpg) 其结果和前面某章类似,slice 非但没有提升性能,反而在堆上分配了更多内存,有些得不偿失。当然,这个案例未必就是绝对的,所有的性能提升都需依照具体上下文来分析。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3718 次点击  
加入收藏 微博
1 回复  |  直到 2016-06-15 10:04:22
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传