首页  >  文章  >  后端开发  >  Go 中切片赋值总是比切片追加快吗?

Go 中切片赋值总是比切片追加快吗?

Linda Hamilton
Linda Hamilton原创
2024-11-12 10:19:02891浏览

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