博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go 性能优化技巧 9/10
阅读量:7241 次
发布时间:2019-06-29

本文共 500 字,大约阅读时间需要 1 分钟。

hot3.png

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

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

channel1

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

channel2

channel3

channel4

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

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

channel5

channel6

channel7

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

转载于:https://my.oschina.net/wdyoschina/blog/711512

你可能感兴趣的文章
Erlang使用ProtoBuffer
查看>>
集中式(SVN)和分布式(Git)版本控制系统的简单比较
查看>>
Chapter 11. WinForm-文件及文件夹操作
查看>>
索引及基应用
查看>>
[BZOJ 4800][Ceoi2015]Ice Hockey World Championship(Meet-in-the-Middle)
查看>>
python 数据加密以及生成token和token验证
查看>>
学Js之prototype
查看>>
CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
查看>>
Apache Storm
查看>>
优达学城数据分析师纳米学位——P4项目知识点整理及代码分析
查看>>
lambda 分组练习
查看>>
PowerDesigner Comment与Name相互替换
查看>>
(二) JPA基础
查看>>
(四)Centos之查询目录中内容命名ls
查看>>
压缩 KVM 的 qcow2 镜像文件
查看>>
紫书 例题 10-26 UVa 11440(欧拉函数+数论)
查看>>
DDOS攻击攻击种类和原理
查看>>
Redis的应用场景
查看>>
数据需求统计常用awk命令
查看>>
绘图: matplotlib核心剖析
查看>>