golang slice与list 性能
合适的数据结构可以达到事半功倍的效果
数据结构的选择要长期经验积累与不断学习
slice与list遍历 创建 添加元素速度
package mainimport (
"time"
"fmt"
"container/list"
)
func main() {
t := time.Now()
slice:=make([]int ,10)
for i := 0; i<1*100000;i++ {
slice = append(slice, 1)
}
fmt.Println("创建slice用时:" + time.Now().Sub(t).String())
t = time.Now()
l:=list.New()
for i := 0; i<1*100000;i++ {
l.PushBack(1)
}
fmt.Println("创建list用时:" + time.Now().Sub(t).String())
}
运行结果
创建slice用时:4.0003ms
创建 list 用时:34.0019ms
100000条数据 slice 创建和添加元素的速度约是list的5~8倍
list和slice的遍历速度
package mainimport (
"time"
"fmt"
"container/list"
)
func main() {
sli:=make([]int ,10)
for i := 0; i<1*100000*100;i++ {
sli=append(sli, 1)
}
l:=list.New()
for i := 0; i<1*100000*100;i++ {
l.PushBack(1)
}
t := time.Now()
for _,_ = range sli {
//fmt.Printf("values[%d]=%d\n", i, item)
}
fmt.Println("遍历slice:" + time.Now().Sub(t).String())
t = time.Now()
for e := l.Front(); e != nil; e = e.Next() {
//fmt.Println(e.Value)
}
fmt.Println("遍历list:" + time.Now().Sub(t).String())
}
运行结果
遍历slice:16.0009ms
遍历list:107.0061ms
1亿条数据来讲slice 遍历速度约是list的速度的10倍
list和slice的插入速度
package mainimport (
"time"
"fmt"
"container/list"
)
func main() {
sli:=make([]int ,10)
for i := 0; i<1*100000*100;i++ {
sli=append(sli, 1)
}
l:=list.New()
for i := 0; i<1*100000*100;i++ {
l.PushBack(1)
}
//比较插入
t := time.Now()
slif:=sli[:100000*50]
slib:=sli[100000*50:]
slif=append(slif, 10)
slif=append(slif, slib...)
fmt.Println("slice 的插入:" + time.Now().Sub(t).String())
var em *list.Element
len:=l.Len()
var i int
for e := l.Front(); e != nil; e = e.Next() {
i++
if i ==len/2 {
em=e
break
}
}
//忽略掉找中间元素的速度
t = time.Now()
ef:=l.PushBack(2)
l.MoveBefore(ef,em)
fmt.Println("list: " + time.Now().Sub(t).String())
}
运行结果:
slice 的插入:12.0007ms
list: 0s
list的插入结果约是list 的”无穷”倍
对于大数据 频繁的插入和删除用list
频繁的遍历查询选slice
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题