Golang切片附加vs分配性能

Golang切片附加vs分配性能,第1张

概述为了使切片附加 *** 作更快,我们需要分配足够的容量.有两种方法可以追加切片,这是代码: func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) for i := 0; i < b.N; i++ { a = append(a, i) }}func BenchmarkSliceSet 为了使切片附加 *** 作更快,我们需要分配足够的容量.有两种方法可以追加切片,这是代码:
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分配性能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存