首页  >  文章  >  后端开发  >  Go 中切片操作的直接赋值比追加更快吗?

Go 中切片操作的直接赋值比追加更快吗?

DDD
DDD原创
2024-11-10 06:41:02669浏览

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