加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang切片附加vs分配性能

发布时间:2020-12-16 19:04:13 所属栏目:大数据 来源:网络整理
导读:为了使切片附加操作更快,我们需要分配足够的容量.有两种方法可以追加切片,这是代码: 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([]in
为了使切片附加操作更快,我们需要分配足够的容量.有两种方法可以追加切片,这是代码:
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’

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读