做为内置类型,通道(channel)从运行时获得不少支持,其自身设计也算得上精巧。但无论怎么说,它本质上依旧是一种队列,当多个 goroutine 并发操做时,免不了要使用锁。某些时候,这种竞争机制,会致使性能问题。并发
下面是一个简单利用 channel 收发数据的示例,为便于 “准确” 测量收发操做性能,咱们将 make channel 操做放到外部,尽量避免额外消耗。性能
在研究 go runtime 源码实现过程当中,会看到大量利用 “批操做” 来提高性能的样例。在此,咱们可借鉴一下,看看效果对比。测试
从测试结果看,性能提高很高,可见批操做是一种有效方案。spa
就此例而言,是否可使用 slice 代替 array 块?直观上,slice 可减小经过 channel 传递的数据大小,减小数据复制,彷佛可进一步提高性能。不妨作个测试。设计
其结果和前面某章相似,slice 非但没有提高性能,反而在堆上分配了更多内存,有些得不偿失。固然,这个案例未必就是绝对的,全部的性能提高都需依照具体上下文来分析。队列
最新动态,请扫码关注图片