Go 性能優(yōu)化技巧 5/10

閉包(closure)也是很常見的編碼模式,因它隱式攜帶上下文環(huán)境變量,因此可讓算法代碼變得更加簡潔。


但任何 “便利” 和 “優(yōu)雅” 的背后,往往都是更復(fù)雜的實(shí)現(xiàn)機(jī)制,無非是語法糖或編譯器隱藏了相關(guān)細(xì)節(jié)。最終,這些都會(huì)變成額外成本在運(yùn)行期由 CPU、runtime 負(fù)擔(dān)。甚至因不合理使用,造成性能問題。

用幾個(gè)代碼片段看看可能的麻煩。



單次調(diào)用的性能差異有點(diǎn)大(不同環(huán)境結(jié)果會(huì)不同),但這會(huì)不會(huì)和匿名函數(shù)本身構(gòu)建有關(guān)?



似乎是這樣。可接下來的問題就更麻煩了。(代碼僅作演示,并未保證邏輯一致)


首先,閉包引用原環(huán)境變量,導(dǎo)致 y 逃逸到堆上,這必然增加了 GC 掃描和回收對象的數(shù)量。


接下來,同樣是因?yàn)殚]包引用原對象,造成數(shù)據(jù)競爭(data race)。


可見,閉包未必總能將事情 “簡單化”。在學(xué)習(xí) Go 底層實(shí)現(xiàn)過程中,你會(huì)了解到,所有 “簡單” 都是由編譯器或運(yùn)行時(shí)用一堆復(fù)雜過程堆出來的。

——未完待續(xù)


請關(guān)注微信公眾號


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容