Go 性能优化技巧 9/10

作为内置类型,通道(channel)从运行时得到很多支持,其自身设计也算得上精巧。但不管怎么说,它本质上依旧是一种队列,当多个 goroutine 并发操作时,免不了要使用锁。某些时候,这种竞争机制,会导致性能问题。

下面是一个简单利用 channel 收发数据的示例,为便于 “准确” 测量收发操作性能,我们将 make channel 操作放到外部,尽可能避免额外消耗。

图片描述

在研究 go runtime 源码实现过程中,会看到大量利用 “批操作” 来提升性能的样例。在此,我们可借鉴一下,看看效果对比。

图片描述
图片描述
图片描述

从测试结果看,性能提升很高,可见批操作是一种有效方案。

就此例而言,是否可以使用 slice 代替 array 块?直观上,slice 可减少通过 channel 传递的数据大小,减少数据复制,似乎可进一步提升性能。不妨做个测试。

图片描述
图片描述
图片描述

其结果和前面某章类似,slice 非但没有提升性能,反而在堆上分配了更多内存,有些得不偿失。当然,这个案例未必就是绝对的,所有的性能提升都需依照具体上下文来分析。

最新动态,请扫码关注
图片描述

阅读 5.7k

推荐阅读
雨痕学堂
用户专栏

技术分享,关于Go、Python等。

155 人关注
11 篇文章
专栏主页