首頁  >  文章  >  後端開發  >  Go 中切片賦值總是比切片追加快嗎?

Go 中切片賦值總是比切片追加快嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-12 10:19:02928瀏覽

Is Slice Assignment Always Faster Than Slice Append in Go?

效能比較: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 函數涉及幾個步驟:

  1. 複製現有切片頭
  2. 為可變參數建立臨時切片參數
  3. 必要時重新切片現有切片
  4. 將新值分配給切片的元素
  5. 傳回一個新切片,然後將其分配給局部變數

即使其中一些步驟被最佳化或內聯,在每次循環迭代中更新局部切片變數的需要也會增加計算量與更簡單的賦值操作相比的開銷。

以上是Go 中切片賦值總是比切片追加快嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn