• 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
    ", 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。

  • 相关阅读:
    Java生成二维码连接
    Spring boot 整合 Elasticsearch
    Windows下安装ElasticSearch
    springcloud zookeeper+gateway
    idea中Springcloud同时运行多个模块、微服务
    【转】为什么我的DIV块前总有空隙?
    【转载】通过JSFL让Flash Professional CS4或CS5拥有批量FLA导出SVG的功能
    jQuery Mobile中的页面加载与跳转机制
    关于Conversion to Dalvik format failed with error 1错误
    带权重的随机输出数组中的元素
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10318281.html
Copyright © 2020-2023  润新知