Go 性能优化技巧 5/10
2016-05-01 00:00
465 查看
摘要: 闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。
闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。
但任何 “便利” 和 “优雅” 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由 CPU、runtime 负担。甚至因不合理使用,造成性能问题。
用几个代码片段看看可能的麻烦。
单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关?
似乎是这样。可接下来的问题就更麻烦了。(代码仅作演示,并未保证逻辑一致)
首先,闭包引用原环境变量,导致 y 逃逸到堆上,这必然增加了 GC 扫描和回收对象的数量。
接下来,同样是因为闭包引用原对象,造成数据竞争(data race)。
可见,闭包未必总能将事情 “简单化”。在学习 Go 底层实现过程中,你会了解到,所有 “简单” 都是由编译器或运行时用一堆复杂过程堆出来的。
最新动态,请扫码关注
闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。
但任何 “便利” 和 “优雅” 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由 CPU、runtime 负担。甚至因不合理使用,造成性能问题。
用几个代码片段看看可能的麻烦。
单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关?
似乎是这样。可接下来的问题就更麻烦了。(代码仅作演示,并未保证逻辑一致)
首先,闭包引用原环境变量,导致 y 逃逸到堆上,这必然增加了 GC 扫描和回收对象的数量。
接下来,同样是因为闭包引用原对象,造成数据竞争(data race)。
可见,闭包未必总能将事情 “简单化”。在学习 Go 底层实现过程中,你会了解到,所有 “简单” 都是由编译器或运行时用一堆复杂过程堆出来的。
最新动态,请扫码关注
相关文章推荐
- 深入理解PHP7内核之FAST_ZPP
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Flex 性能优化常用手法总结
- oracle 性能优化建议小结
- Lua性能优化技巧(一):前言
- Lua性能优化技巧(五):削减、重用和回收
- Lua性能优化技巧(三):关于表
- Lua性能优化技巧(四):关于字符串
- SQL Server 2016 查询存储性能优化小结
- MySQL性能优化 出题业务SQL优化
- SQLSERVER 中GO的作用详解
- PowerShell脚本性能优化技巧总结
- SQL SERVER性能优化综述(很好的总结,不要错过哦)第1/3页
- MySQL Index Condition Pushdown(ICP)性能优化方法实例
- Ajax无刷新分页的性能优化方法
- dedecms负载性能优化实例,三招让你的dedecms快10倍以上第1/2页
- 如何减少浏览器的reflow和repaint
- javascript日期处理函数,性能优化批处理
- Listview加载的性能优化是如何实现的