golang slice

#slice append 实现 s2 := append(s1, *) 切片s1上记录的切片信息复制给s2,

1.如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。

2.如果s1指向的底层array长度够, s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。

开辟一块区域存储底层array 使用下面的策略: 1.如果 增加的 len < s的cap 则 新s的cap*2 2.如果 增加的 len > s的cap 则 新s的cap = 老cap + 增加数据的 len #测试slice和list性能


package main

import (
	l "container/list"
	"fmt"
	"time"
)

var (
	name = "viney"
)

func list() {
	names := l.New()
	t := time.Now()
	for i := 1; i <= 10000000; i++ {
		_ = names.PushFront(name)
	}
	fmt.Println("list: " + time.Now().Sub(t).String())
}

func slice() {
	names := make([]string, 0, 1)

	t := time.Now()
	fmt.Println("init cap: ", cap(names))
	for i := 1; i <= 10000000; i++ {
		names = append(names, name)
	}
	fmt.Println("slice: " + time.Now().Sub(t).String())
	fmt.Println("new cap: ", cap(names))
}

func main() {
	slice()
	list()
}


output
init cap:  1
slice: 2.4239847s
new cap:  10350080
list: 1.9973994s

转载于:https://my.oschina.net/leonardtang/blog/1541278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值