知识卡片
Defer优化演进
内容
(书中 Go 1.13⁄1.14)defer 实现经历堆分配→栈分配→内联优化三阶段:Go 1.12 前统一堆分配,约50ns;Go 1.13 把”最多调用一次”的 defer 放栈上,降到约35ns;Go 1.14 用位图内联展开,使 defer 与直接调用性能基本相当。性能判断要结合具体版本,不能把旧经验当永久结论。
参考来源
- 位置:《Go语言底层原理剖析》第10章《defer延迟调用》10.4.1节《defer演进》
- 结论依据:原文明确"Go语言中defer的实现经历了复杂的演进过程,Go 1.13、Go 1.14都经历了比较大的更新",给出具体耗时数据"defer的操作时间从Go 1.12时的50ns降到Go 1.13时35ns(直接调用大约花费6ns)",并说明"Go 1.14进一步对最多调用一次的defer语义进行了优化,通过编译时实现内联优化",因此可以推出"defer 性能演进分堆分配/栈分配/内联三阶段、且与具体版本绑定"的结论。
- 原始内容:Go语言中defer的实现经历了复杂的演进过程,Go 1.13、Go 1.14都经历了比较大的更新。在Go 1.13之前,defer是被分配在堆区的……为了将调用defer函数的成本降到与调用普通函数相同。Go 1.13在大部分情况下将defer语句放置在了栈中……defer的操作时间从Go 1.12时的50ns降到Go 1.13时35ns(直接调用大约花费6ns)。Go 1.14进一步对最多调用一次的defer语义进行了优化,通过编译时实现内联优化。