#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
有疑问加站长微信联系(非本文作者)