加速 Go 中的切片追加操作
在 Go 中,切片是儲存值序列的關鍵資料結構。將元素附加到切片時,優化效能至關重要。本文探討了兩種附加到切片的方法之間的性能差異:附加和直接賦值 (=)。
基準分析
為了比較效能,我們執行使用以下程式碼進行兩個基準測試:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) // Create an empty slice with sufficient capacity for i := 0; i < b.N; i++ { a = append(a, i) // Append i to the slice } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) // Create a slice with size b.N for i := 0; i < b.N; i++ { a[i] = i // Assign i to the slice's ith element } }
基準測試結果顯示直接賦值(a[i] = i)比使用追加快得多:
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
為什麼賦值比追加快?
效能差異源自於每種方法執行的不同操作:
Append (a =append(a, i)): 這個函數涉及更複雜的過程:
總而言之,每個追加操作都會涉及複製切片頭和創建臨時切片的額外開銷,而直接賦值只是修改現有的切片元素。此開銷會導致觀察到的效能差異。
建議
為了在附加到切片時獲得最佳性能,建議使用 make 預先分配足夠的容量,而不是重複使用追加函數。這消除了動態記憶體分配和重新切片的需要,顯著提高了效率。
以上是Go 中切片運算的直接賦值比追加更快嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!