首页 >后端开发 >Golang >Go 中哪个更快:`append()` 或切片赋值?

Go 中哪个更快:`append()` 或切片赋值?

DDD
DDD原创
2024-11-11 01:49:02771浏览

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)”(追加):

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