Go 性能优化技巧 6/10
2016-07-12 00:00
295 查看
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 时间片还给内核。
从没一种技术或技巧适用于所有场合。无论是表达,或者选型,都不应该脱离实际场景(上下文)。另外,就本系列的优化技巧而言,除非真有必要,否则大可不必理会这些 “奇技淫巧”。至于担心能否适应未来变化,我觉得多余。因为无论是架构、算法,亦或者是这些技巧,你本就应该有相应的机制确保在 “变化” 发生时第一时间获知。再者说,技巧并非照抄,无非多种思路而已。知其形,明其意,方为正理。
在我看来,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 时间片还给内核。
从没一种技术或技巧适用于所有场合。无论是表达,或者选型,都不应该脱离实际场景(上下文)。另外,就本系列的优化技巧而言,除非真有必要,否则大可不必理会这些 “奇技淫巧”。至于担心能否适应未来变化,我觉得多余。因为无论是架构、算法,亦或者是这些技巧,你本就应该有相应的机制确保在 “变化” 发生时第一时间获知。再者说,技巧并非照抄,无非多种思路而已。知其形,明其意,方为正理。
相关文章推荐
- Go 性能优化技巧 7/10
- Go 性能优化技巧 8/10
- HDU5546 Ancient Go DFS
- goldengate 学习有用网址
- GO的GDB调试
- 统一日志管理-Mongo 篇
- 大话设计模式(Golang) 二、策略模式
- Django开发环境的搭建
- golang学习之rpc实例
- 最新的黑客大杀器:Google Dorking
- mongoose
- Is it Google Hacking? It's Google Dorking
- 欢迎使用CSDN-markdown编辑器
- pycharm快捷键、配置virtualenv环境,配置django调试,配置远程调试
- Go语言_Go_Golang 逐行读取文件
- web流量/镜像复制工具——gor
- #include<algorithm>里的函数
- 终于又弄完一个DJANGO BY EXAMPLE的测试
- STL<algorithm>中的nth_element()方法的使用
- POJ 3107 Godfather