func BenchmarkSliceAppend(b *testing.B) { a := make([]int,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 }}
结果是:
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op
BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
a [i] = i比a = append(a,i)快,我想知道为什么?
a [i] =我只是将值i赋给a [i].这不是追加,它只是一个简单的 assignment.现在附加:
a = append(a,i)
理论上会发生以下情况:
>这称为内置append()
功能.为此,它首先必须复制一个切片(切片头,支持数组不是头的一部分),并且它必须为包含值i的可变参数创建一个临时切片.
>然后,如果它有足够的容量(在你的情况下就像a = a [:len(a)1]那么它必须重新解析 – 这涉及将新切片分配给append()内部.
(如果a没有足够大的容量来“就地”进行附加,则必须分配一个新数组,复制切片的内容,然后执行assign / append – 但这不是这里的情况. )
>然后将i分配给[len(a)-1].
>然后从append()返回新切片,并将此新切片分配给局部变量a.
与简单的任务相比,这里发生了很多事情.即使许多这些步骤被优化和/或内联,作为将i分配给切片的元素的最小附加,切片类型的局部变量a(切片头)必须在每个周期中更新.环.
推荐阅读:The Go Blog: Arrays,slices (and strings): The mechanics of ‘append’
总结以上是内存溢出为你收集整理的Golang切片附加vs分配性能全部内容,希望文章能够帮你解决Golang切片附加vs分配性能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)