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)”涉及一系列操作:
与“a[i] = i 中的直接赋值相比,这些额外的步骤会带来开销".
结论
了解切片操作之间的性能差异对于优化代码效率至关重要。对于简单的赋值,“a[i] = i”被证明是一个更有效的选择。然而,当需要扩展切片时,“a =append(a, i)”仍然是合适的方法。
以上是Go 中哪个更快:`append()` 或切片赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!