加速 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
为什么赋值比追加更快?
性能差异源于每种方法执行的不同操作:
Append (a =append(a, i)): 这个函数涉及更复杂的过程:
总而言之,每个追加操作都会涉及复制切片头和创建临时切片的额外开销,而直接赋值只是修改现有的切片元素。此开销会导致观察到的性能差异。
建议
为了在附加到切片时获得最佳性能,建议使用 make 预先分配足够的容量,而不是重复使用追加函数。这消除了动态内存分配和重新切片的需要,显着提高了效率。
以上是Go 中切片操作的直接赋值比追加更快吗?的详细内容。更多信息请关注PHP中文网其他相关文章!