文档章节

Go 性能优化技巧 4/10

雨痕学堂
 雨痕学堂
发布于 2016/04/28 17:52
字数 476
阅读 416
收藏 3

延迟调用(defer)确实是一种 “优雅” 机制。可简化代码,并确保即便发生 panic 依然会被执行。如将 panic/recover 比作 try/except,那么 defer 似乎可看做 finally。


如同异常保护被滥用一样,defer 被无限制使用的例子比比皆是。

只需稍稍了解 defer 实现机制,就不难理解会有这样的性能差异。


编译器通过 runtime.deferproc “注册” 延迟调用,除目标函数地址外,还会复制相关参数(包括 receiver)。在函数返回前,执行 runtime.deferreturn 提取相关信息执行延迟调用。这其中的代价自然不是普通函数调用一条 CALL 指令所能比拟的。


或许你会觉得 4x 的性能差异算不得什么,但如果是下面这样呢?

当多个 goroutine 执行该函数时,只怕性能差异就不是 4x,还得算上 httpGet 所需时间。原本的并发设计,因为错误的 defer 调用变成 “串行”。


与之类似的,还有下面这样的写法。

如果 files 是个 “超大” 列表,只怕在 analysis 结束前,会有不小的隐式 “资源泄露”,这些不能及时回收的对象,会导致 GC 在内的相关性能问题。


解决方法么,要么去掉 f.close 前的 defer,要么将内层处理逻辑重构为独立函数(比如匿名函数调用)。

除此之外,单个函数里过多的 defer 调用可尝试合并。最起码,在并发竞争激烈时,mutex.Unlock 不应该使用 defer,而应尽快执行,仅保护最短的代码片段。




最新动态,请扫码关注


© 著作权归作者所有

雨痕学堂
粉丝 19
博文 11
码字总数 5234
作品 0
朝阳
私信 提问
加载中

评论(1)

LinkerLin
LinkerLin
defer最好别用,资源请求后,应该尽快释放。如果重型操作,应该复制数据后,释放资源。
Go的并发思想就是,尽量不用锁,不要长时间打开文件等资源,一次性复制,复制,复制。
PHP性能优化的小技巧

今天我们来分享10条PHP性能优化的小技巧: (1)循环内部不要声明变量,尤其是对象这样的变量 (2)foreach效率更高,尽量用foreach代替while和for循环 (3)在多重嵌套循环中,如有可能,应当将最...

京牛教育科技
2016/08/26
40
0
年薪:8-10万学历不限招高级工程师

北京神州立诚科技有限公司(广州公司) Novell中国区盒装产品总代理 EnterpriseDB大中华区总代理(包括港澳台) 公司网址:http://www.focus-soft.com 工作职位:高级工程师 工作范围: 负责软件...

JavaGG
2012/04/19
3.1K
14
写给使用Unity进行游戏开发的建议

Unity是一款非常流行的游戏开发软件。它的功能令人印象深刻,也能够适应不同的游戏开发要求。游戏开发人员可以使用Unity创建任意类型的游戏,从世界级的RPG游戏到最受欢迎的增强现实游戏Pok...

宁金峰
2017/11/09
0
0
Unity优化百科(UWA 博客目录)

原文链接:https://blog.uwa4d.com/archives/Index.html Hello, 各位Unity开发者,无论您是正用着UWA的工具、还是阅读着UWA的相关技术文章亦或是在UWA博客中寻找一个问题的解答,我们都倍感荣...

UWA4D
2017/10/26
0
0
25条提高iOS App性能的技巧和诀窍

这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址 当我们开发iOS应用时,好的性能对我...

mahb520
2015/01/17
148
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
2.9K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
5
0
用好项目管理工具,人人都可以成为项目经理

现在市面上的项目管理工具越来越多了,但是大多数都是一些协同工具或轻量项目管理工具。如果是多团队、跨部门使用或者企业级的项目管理,从管理思想到工具运用,需要适应企业的业务流程体系,...

cs平台
昨天
12
0
只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
69
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部