大家好,在这个週末我参加了Golang-Conference-2020,每个议程养分都很高,而在最后一个议程Deep Dive into The Escape Analysis in Go刷新我的三观。
为什么传递指标母汤
先说结论:
在 Golang 中,传递指标因为要做
Escape Analysis
导致效能消耗,所以比传递值还要慢
在 C/C++的世界中,我们需要自行控管记忆体,放在 stack 或 heap 我们须控管他们的释放,但由于 Golang 有 GC(Garbage Collection),所以 Golang 本身会帮我们控管记忆体的释放,
而这个变数到底要放在 stack 或 heap 就要透过Escape Analysis
来分析,如果变数以指标的方式传递给函数,Escape Analysis
在分析的时间往往多过传递值的时间,所以在 Golang 中传递指标反而是没有效能优点的。
所以真的只有缺点吗?
也不然,在when-to-use-pointers-in-go提到,如果複製的是非常大的变数
,那传递指标是有机会比传递值还快的,毕竟传递值就是複製一个值到函数中,但这个非常大的变数
到底多大并没有正确答案,大家还是要用 benchmark 来测试才会知道。
在 Golang 中,我曾经为了效能一直使用指标,而指标导致没办法像 FP 一样有稳定的 output 一直让我头疼,但后来发现原来根本没有提升效能真的是让我大大上了一刻,真的是没搞清楚做了一堆白工呢 XD。