效能比較:Go 中的切片追加與分配
在Go 中使用切片時,附加和分配元素等操作可能會產生顯著的影響性能影響。切片追加有兩種常用方法:
append(slice, value):此函數會建立一個具有擴充容量的新切片以容納新元素,並將現有元素複製到new slice.
slice[index] = value:此賦值直接修改切片指定索引處的元素,而不創建
為了比較這兩種方法的性能,創建了以下兩個基準函數:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) for i := 0; i < b.N; i++ { a = append(a, i) } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) for i := 0; i < b.N; i++ { a[i] = i } }
結果顯示slice[index] = value 明顯比append(slice, value):
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
了解效能差異
為什麼切片分配比切片追加更快?關鍵區別在於,賦值是一個簡單的就地操作,無需任何複製或重新分配即可修改現有切片。
另一方面,append 函數涉及幾個步驟:
即使其中一些步驟被最佳化或內聯,在每次循環迭代中更新局部切片變數的需要也會增加計算量與更簡單的賦值操作相比的開銷。
以上是Go 中切片賦值總是比切片追加快嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!