Week37 -我当时害怕极了,原来Golang用指标是母汤的 [Server的终局之战系列]

大家好,在这个周末我参加了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。

参考


<<:  鼠年全马铁人挑战 WEEK 39:封包测试工具 - Charles (四)

>>:  JavaScript ⑅ES6:展开运算子 & 其余运算子

质询握手身份验证协议(CHAP)

质询握手身份验证协议(Challenge-Handshake Authentication Prot...

android studio 30天学习笔记-day 15-databinding 双向绑定

昨天了解如何使用databinding的单向绑定,把data放到view里,那反过来当view发生变...

C#学习笔记1:C#程序结构 (Visual Studio)

这是我一边学习一边写下的笔记,如果内容有错,恳请在下方留言跟我说,我会非常感谢的!!! 以下我们用主...

Day26 - 部属到正式环境 (1)

今天的实作内容主要根据教学网站进行。 接下来两天的主要内容是将Django部属到正式环境,让使用者可...

[Day 28] LIFF Bluetooth 与 LINE Things

前言 所以说LIFF Bluetooth能用在哪里? 最近我买了一台智能电风扇,当觉得热,又觉得伫立...