首頁 >後端開發 >Golang >Go 中哪一個比較快:`append()` 或切片賦值?

Go 中哪一個比較快:`append()` 或切片賦值?

DDD
DDD原創
2024-11-11 01:49:02799瀏覽

Which is faster in Go: `append()` or slice assignment?

Go 中切片追加和賦值的效能比較

在 Go 中,切片在高效管理資料方面發揮著重要作用。然而,關於兩種常用切片操作:追加和賦值之間的性能差異,出現了問題。

追加與分配

append() 操作擴展了現有切片帶有附加元素,而賦值運算子(=) 在應用於切片時,只需用新元素覆蓋現有元素

性能分析

對以下程式碼進行基準測試展示了效能差距:

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
    }
}

基準測試結果顯示「a[i] = i」(賦值)總是優於「a =append(a, i)」 (append):

BenchmarkSliceAppend    200000000                7.87 ns/op            8 B/op          0 allocs/op
BenchmarkSliceSet       300000000                5.76 ns/op            8 B/op

解釋

「a[i] = i」更快的表現可以歸因於其直接賦值的性質。它只是將值 i 賦給切片中的對應元素。

相反,「a =append(a, i)」涉及一系列操作:

  1. 複製現有切片頭。
  2. 為可變參數 (i) 建立一個暫時切片。
  3. 如果存在則重新切片 a足夠的容量(在基準測試中提供)。
  4. 將 i 分配給 a 的最後一個元素。
  5. 更新局部變數 (a) 中的切片頭。

與「a[i] = 中的直接賦值相比,這些額外的步驟會帶來開銷i"。

結論

了解切片操作之間的效能差異對於最佳化程式碼效率至關重要。對於簡單的賦值,「a[i] = i」被證明是一個更有效的選擇。然而,當需要擴展切片時,「a =append(a, i)」仍然是合適的方法。

以上是Go 中哪一個比較快:`append()` 或切片賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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