閉包(closure)也是很常見(jiàn)的編碼模式花嘶,因它隱式攜帶上下文環(huán)境變量原押,因此可讓算法代碼變得更加簡(jiǎn)潔辽装。
但任何 “便利” 和 “優(yōu)雅” 的背后参袱,往往都是更復(fù)雜的實(shí)現(xiàn)機(jī)制吠冤,無(wú)非是語(yǔ)法糖或編譯器隱藏了相關(guān)細(xì)節(jié)浑彰。最終,這些都會(huì)變成額外成本在運(yùn)行期由 CPU拯辙、runtime 負(fù)擔(dān)郭变。甚至因不合理使用,造成性能問(wèn)題涯保。
用幾個(gè)代碼片段看看可能的麻煩诉濒。
單次調(diào)用的性能差異有點(diǎn)大(不同環(huán)境結(jié)果會(huì)不同),但這會(huì)不會(huì)和匿名函數(shù)本身構(gòu)建有關(guān)夕春?
似乎是這樣未荒。可接下來(lái)的問(wèn)題就更麻煩了及志。(代碼僅作演示片排,并未保證邏輯一致)
首先寨腔,閉包引用原環(huán)境變量,導(dǎo)致 y 逃逸到堆上率寡,這必然增加了 GC 掃描和回收對(duì)象的數(shù)量迫卢。
接下來(lái),同樣是因?yàn)殚]包引用原對(duì)象勇劣,造成數(shù)據(jù)競(jìng)爭(zhēng)(data race)靖避。
可見(jiàn),閉包未必總能將事情 “簡(jiǎn)單化”比默。在學(xué)習(xí) Go 底層實(shí)現(xiàn)過(guò)程中幻捏,你會(huì)了解到,所有 “簡(jiǎn)單” 都是由編譯器或運(yùn)行時(shí)用一堆復(fù)雜過(guò)程堆出來(lái)的命咐。