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

對于一些初學者,自知道 Go 里面的 array 以 pass-by-value 方式傳遞后,就莫名地引起 “恐慌”。外加諸多文章未作說明,就建議用 slice 代替 array,企圖避免數(shù)據(jù)拷貝,提升性能。實際上,此做法有待商榷。某些時候怕會適得其反,倒造成不必要的性能損失。

用個簡單的示例說明。


代碼很簡單,兩個函數(shù)分別返回 “內(nèi)容相同” 的 array 和 slice。為避免編譯器優(yōu)化,特填充了全部數(shù)據(jù),以模擬 “真實” 數(shù)據(jù)復制行為。接下來,看看性能測試對比。



這結果怕是顛覆了最初認知。array 非但擁有更好的性能,還避免了堆內(nèi)存分配,也就是說減輕了 GC 壓力。為什么會這樣?

熟悉匯編的,怕是很容易看出來。函數(shù) array 返回值的復制只需用 "CX + REP" 指令就可完成。


整個 array 函數(shù)完全在棧上完成,而 slice 函數(shù)則需執(zhí)行 makeslice,繼而在堆上分配內(nèi)存,這就是問題所在。


對于一些短小的對象,復制成本遠小于在堆上分配和回收操作。

Go Proverbs: A little copying is better than a little dependency.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——未完待續(xù)


請關注微信公眾號:


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容