Go 性能優化技巧 5/10

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

圖片描述

但任何 「便利」 和 「優雅」 的背後,每每都是更復雜的實現機制,無非是語法糖或編譯器隱藏了相關細節。最終,這些都會變成額外成本在運行期由 CPU、runtime 負擔。甚至因不合理使用,形成性能問題。閉包

用幾個代碼片斷看看可能的麻煩。函數

圖片描述
圖片描述

單次調用的性能差別有點大(不一樣環境結果會不一樣),但這會不會和匿名函數自己構建有關?性能

圖片描述
圖片描述

彷佛是這樣。可接下來的問題就更麻煩了。(代碼僅做演示,並未保證邏輯一致)學習

圖片描述

首先,閉包引用原環境變量,致使 y 逃逸到堆上,這必然增長了 GC 掃描和回收對象的數量。編碼

圖片描述

接下來,一樣是由於閉包引用原對象,形成數據競爭(data race)。spa

圖片描述

可見,閉包未必總能將事情 「簡單化」。在學習 Go 底層實現過程當中,你會了解到,全部 「簡單」 都是由編譯器或運行時用一堆複雜過程堆出來的。對象

最新動態,請掃碼關注
圖片描述圖片

相關文章
相關標籤/搜索