性能比较: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 函数涉及几个步骤:
即使其中一些步骤被优化或内联,在每次循环迭代中更新局部切片变量的需要也会增加计算量与更简单的赋值操作相比的开销。
以上是Go 中切片赋值总是比切片追加快吗?的详细内容。更多信息请关注PHP中文网其他相关文章!