Go 性能优化技巧 5/10
2016-07-12 00:00
344 查看
闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。
![](http://studygolang.qiniudn.com/160602/82742f3816c320e64b8fe893cbf87eb8.jpg)
但任何 “便利” 和 “优雅” 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由 CPU、runtime 负担。甚至因不合理使用,造成性能问题。
用几个代码片段看看可能的麻烦。
![](http://studygolang.qiniudn.com/160602/8a2b84bb90c8537f3b05166e20e25cba.jpg)
![](http://studygolang.qiniudn.com/160602/f2dee0e85d4e4bc40eaa90d59b740833.jpg)
单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关?
![](http://studygolang.qiniudn.com/160602/cdc1509ec0feee9822d36634ca0302fa.jpg)
![](http://studygolang.qiniudn.com/160602/ab8db6b0891285c2e71b2a91fca00628.jpg)
似乎是这样。可接下来的问题就更麻烦了。(代码仅作演示,并未保证逻辑一致)
![](http://studygolang.qiniudn.com/160602/6360a193663a9f68217ab7423a2ae2ab.jpg)
首先,闭包引用原环境变量,导致 y 逃逸到堆上,这必然增加了 GC 扫描和回收对象的数量。
![](http://studygolang.qiniudn.com/160602/fef2f2acb6f6ca31bec33327edd55a66.jpg)
接下来,同样是因为闭包引用原对象,造成数据竞争(data race)。
![](http://studygolang.qiniudn.com/160602/d3ee39db5037427402c271b2cd4e0d15.jpg)
可见,闭包未必总能将事情 “简单化”。在学习 Go 底层实现过程中,你会了解到,所有 “简单” 都是由编译器或运行时用一堆复杂过程堆出来的。
![](http://studygolang.qiniudn.com/160602/82742f3816c320e64b8fe893cbf87eb8.jpg)
但任何 “便利” 和 “优雅” 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由 CPU、runtime 负担。甚至因不合理使用,造成性能问题。
用几个代码片段看看可能的麻烦。
![](http://studygolang.qiniudn.com/160602/8a2b84bb90c8537f3b05166e20e25cba.jpg)
![](http://studygolang.qiniudn.com/160602/f2dee0e85d4e4bc40eaa90d59b740833.jpg)
单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关?
![](http://studygolang.qiniudn.com/160602/cdc1509ec0feee9822d36634ca0302fa.jpg)
![](http://studygolang.qiniudn.com/160602/ab8db6b0891285c2e71b2a91fca00628.jpg)
似乎是这样。可接下来的问题就更麻烦了。(代码仅作演示,并未保证逻辑一致)
![](http://studygolang.qiniudn.com/160602/6360a193663a9f68217ab7423a2ae2ab.jpg)
首先,闭包引用原环境变量,导致 y 逃逸到堆上,这必然增加了 GC 扫描和回收对象的数量。
![](http://studygolang.qiniudn.com/160602/fef2f2acb6f6ca31bec33327edd55a66.jpg)
接下来,同样是因为闭包引用原对象,造成数据竞争(data race)。
![](http://studygolang.qiniudn.com/160602/d3ee39db5037427402c271b2cd4e0d15.jpg)
可见,闭包未必总能将事情 “简单化”。在学习 Go 底层实现过程中,你会了解到,所有 “简单” 都是由编译器或运行时用一堆复杂过程堆出来的。
相关文章推荐
- Go 性能优化技巧 6/10
- 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()方法的使用