前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang slice 与list 的性能分析。

golang slice 与list 的性能分析。

作者头像
地球流浪猫
发布2018-08-02 15:31:30
2.3K0
发布2018-08-02 15:31:30
举报
文章被收录于专栏:流浪猫的golang

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

代码语言:javascript
复制
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的遍历速度

代码语言:javascript
复制
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的插入速度

代码语言:javascript
复制
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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年03月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档