golang slice 与list 的性能分析。

一 · 比较slice 与 list 遍历创建和添加元素速度。

package main

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

func main() {
    t := time.Now()
    sli:=make([]int ,10)
    for i := 0; i<1*100000*1000;i++  {
    sli=append(sli, 1)
    }
    fmt.Println("slice 创建速度:" + time.Now().Sub(t).String())

    t = time.Now()
    l:=list.New()
    for i := 0; i<1*100000*1000;i++  {
        l.PushBack(1)
    }
    fmt.Println("list 创建速度: " + time.Now().Sub(t).String())

}

本机运行结果: 
声明:测试结果为个人电脑的测试结果,仅供参考。 
slice 创建速度:1.3029245s 
list 创建速度: 9.7489181s 
对于1亿条数据,slice 的创建和添加元素的速度约是list的7~8倍。

二 · 比较list和slice的遍历速度

package main

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

func main() {
    sli:=make([]int ,10)
    for i := 0; i<1*100000*1000;i++  {
    sli=append(sli, 1)
    }

    l:=list.New()
    for i := 0; i<1*100000*1000;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的速度:32.0235ms 
遍历list的速度:480.3413ms 
对于1亿条数据来讲slice 遍历速度约是list的速度的15倍。

三 · 比较list和slice的插入速度

package main

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

func main() {

    sli:=make([]int ,10)
    for i := 0; i<1*100000*1000;i++  {
    sli=append(sli, 1)
    }

    l:=list.New()
    for i := 0; i<1*100000*1000;i++  {
        l.PushBack(1)
    }
    //比较插入
    t := time.Now()
    slif:=sli[:100000*500]
    slib:=sli[100000*500:]
    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 的插入速度79.054ms 
list 的插入速度 : 0s 
list的插入结果约是list 的”无穷”倍……

总结:对于很多数据来讲:频繁的插入和删除用list,频繁的遍历查询选slice。

posted @ 2019-01-25 10:23  林台山人  阅读(1140)  评论(0编辑  收藏  举报