問題:
儘管預期陣列比切片更快,因為由於其連續性,經驗測試表明,本地切片在訪問其元素時比本地數組要快得多。為什麼會出現這種情況?
背景:
進行了基準測試來比較存取數組和切片元素(包括全域和局部變數)的效能。令人驚訝的是,本地切片成為最快的選擇。
答案:
對本地數組和切片基準的 amd64 彙編的檢查揭示了一個潛在的罪魁禍首。雖然這兩種方法都採用類似的操作,但數組版本在每次訪問期間重複從內存加載數組地址:
LEAQ "".a+1000(SP),BX
相反,切片版本主要對寄存器進行操作,僅從內存執行一次初始載入:
LEAQ (DX)(SI*1),BX
此外,陣列版本會呼叫runtime.duffcopy 彙編例程,而切片版本則不會。此額外的運行時呼叫可能會導致數組版本的效能降低。
附加說明:
無論數組/切片大小如何變化,觀察到的性能差異仍然存在,元素類型,以及基準測試執行的順序。
以上是為什麼本地 Go 切片的元素存取速度比本地數組更快?的詳細內容。更多資訊請關注PHP中文網其他相關文章!