首頁  >  文章  >  後端開發  >  Go 中切片運算的直接賦值比追加更快嗎?

Go 中切片運算的直接賦值比追加更快嗎?

DDD
DDD原創
2024-11-10 06:41:02695瀏覽

Is Direct Assignment Faster than Append for Slice Operations in Go?

加速 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

為什麼賦值比追加快?

效能差異源自於每種方法執行的不同操作:

  • 直接賦值(a[i] = i ): 這只是將切片的第i 個元素的值設定為i。
  • Append (a =append(a, i)): 這個函數涉及更複雜的過程:

    1. 呼叫內建的append函數,為可變參數建立一個新的切片頭和一個臨時切片。
    2. 如果現有切片有足夠的空間,則重新切片容量。
    3. 將 i 分配給新切片的最後一個元素。
    4. 更新局部變數 a 以引用新切片。

總而言之,每個追加操作都會涉及複製切片頭和創建臨時切片的額外開銷,而直接賦值只是修改現有的切片元素。此開銷會導致觀察到的效能差異。

建議

為了在附加到切片時獲得最佳性能,建議使用 make 預先分配足夠的容量,而不是重複使用追加函數。這消除了動態記憶體分配和重新切片的需要,顯著提高了效率。

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

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