golang slice与list 性能


合适的数据结构可以达到事半功倍的效果
数据结构的选择要长期经验积累与不断学习

slice与list遍历 创建 添加元素速度

package main
import (
    "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 main
import (
    "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 main
import (
    "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