Go 性能优化技巧 9/10

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

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

图片描述

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

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

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

就此例而言,是否可使用 slice 代替 array 块?直观上,slice 可减小经过 channel 传递的数据大小,减小数据复制,彷佛可进一步提高性能。不妨作个测试。设计

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

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

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

相关文章
相关标签/搜索