Go 性能优化技巧 9/10

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

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

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

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

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

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



最新动态,请扫码关注




转载于:https://my.oschina.net/qyuhen/blog/669421

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值