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

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

  hot3.png

Go 使用 channel 实现 CSP 模型。处理双方仅关注通道和数据本身,无需理会对方身份和数量,以此实现结构性解耦。在各文宣中都有 “Don't communicate by sharing memory, share memory by communicating.” 这类说法。但这并非鼓励我们不分场合,教条地使用 channel。

在我看来,channel 多数时候适用于结构层面,而非单个区域的数据处理。原话中 “communicate” 本就表明一种 “message-passing”,而非 “lock-free”。所以,它并非用来取代 mutex,各自有不同的使用场景。

有关 channel 实现方式,可参考《Go 学习笔记》第五版,下卷《源码剖析》。

从实现角度看,channel 算是一种很 “重” 的实现。在小粒度层面,其性能真算不得好。我们可用一个常见示例测试一下:用 channel 实现并发安全的计数器,或序号生成器。

性能测试结果表明,差异远比想的要大得多。单就此例而言,还可以用原子操作(atomic)进一步优化。

如果说 channel 适用于结构层面解耦,那么 mutex 则适合保护语句级别的数据安全。至于 atomic,虽然也可实现 lock-free 结构,但处理起来要复杂得多(比如 ABA 等问题),也未必就比 mutex 快很多。还有,sync.Mutex 本就没有使用内核实现,而是像 Futex 那样,直接在用户空间以 atomic 操作完成,因为 runtime 没有任何理由将剩余 CPU 时间片还给内核。

从没一种技术或技巧适用于所有场合。无论是表达,或者选型,都不应该脱离实际场景(上下文)。另外,就本系列的优化技巧而言,除非真有必要,否则大可不必理会这些 “奇技淫巧”。至于担心能否适应未来变化,我觉得多余。因为无论是架构、算法,亦或者是这些技巧,你本就应该有相应的机制确保在 “变化” 发生时第一时间获知。再者说,技巧并非照抄,无非多种思路而已。知其形,明其意,方为正理。

最新动态,请扫码关注

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

你可能感兴趣的文章
UML关系图
查看>>
一个action读取另一个action里的session
查看>>
leetcode 175. Combine Two Tables
查看>>
如何给一个数组对象去重
查看>>
Guava包学习-Cache
查看>>
2019-06-12 Java学习日记之JDBC
查看>>
灯箱效果(点击小图 弹出大图集 然后轮播)
查看>>
linux c 笔记 线程控制(二)
查看>>
samba服务器配置
查看>>
vue.js笔记
查看>>
【Unity3D入门教程】Unity3D之GUI浅析
查看>>
Hive 简单操作
查看>>
湘潭1247 Pair-Pair(树状数组)
查看>>
idea 不能粘贴复制问题
查看>>
IEnumerable<T>
查看>>
IntelliJ IDEA 注册码
查看>>
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>