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

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

hot3.png

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

closure1

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

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

closure2 closure3

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

closure4 closure5

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

closure6

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

closure7

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

closure8

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

转载于:https://my.oschina.net/wdyoschina/blog/710307

你可能感兴趣的文章
PDF 补丁丁 0.5.0.2731 发布(增加去除页面表单和链接水印功能)
查看>>
PDF 补丁丁 0.6.0.3355 版发布(修复阅读模式、书签缩放的问题)
查看>>
python 内嵌模块——time
查看>>
关于form与表单操作
查看>>
网络协议
查看>>
同源策略
查看>>
Date——时间戳转化为YYYY-MM-DD h:m:s时间格式
查看>>
MySQL_PHP学习笔记_2015_0907_PHP用pdo连接数据库时报错 could not find driver
查看>>
字符类型
查看>>
Algs4-1.1.5位于0与1之间则打印true,否则打印false
查看>>
分布式存储 FastDFS-5.0.5线上搭建
查看>>
[Java 基础]ResultSet 指定field映射到Pojo对象的Map
查看>>
Oracle 11g OCM 考试大纲
查看>>
华为 题目大数据计算器
查看>>
学会了怎么推矩阵啊哈哈哈哈哈
查看>>
web开篇
查看>>
day7CSS
查看>>
android中延迟执行某个任务
查看>>
蒲公英分布平台下载更新实现
查看>>
Mysql常用命令详解
查看>>