Go 性能优化技巧 5/10

本文探讨了闭包这一常见编码模式的利弊。虽然闭包可以让算法代码变得更简洁,但其背后隐藏着复杂的实现机制,可能导致运行时性能开销增加、垃圾回收负担加重及数据竞争等问题。

闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。

但任何 “便利” 和 “优雅” 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由 CPU、runtime 负担。甚至因不合理使用,造成性能问题。

用几个代码片段看看可能的麻烦。

单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关?

似乎是这样。可接下来的问题就更麻烦了。(代码仅作演示,并未保证逻辑一致)

首先,闭包引用原环境变量,导致 y 逃逸到堆上,这必然增加了 GC 扫描和回收对象的数量。

接下来,同样是因为闭包引用原对象,造成数据竞争(data race)。

可见,闭包未必总能将事情 “简单化”。在学习 Go 底层实现过程中,你会了解到,所有 “简单” 都是由编译器或运行时用一堆复杂过程堆出来的。


最新动态,请扫码关注

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值