zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Metasploit:一颗没有发现的珍珠
    每个人都用自己的方式去爱自己在乎的人
    设计模式学习使用go实现原型模式 Zhan
    设计模式学习使用go实现代理模式 Zhan
    设计模式学习使用go实现桥接模式 Zhan
    设计模式学习使用go实现建造者模式 Zhan
    多internet出口浮动静态+IP SLA track
    使用 IP SLA 跟踪配置基于策略的路由 (PBR) 自动重定向流量
    使用IP SLA配置静态路由跟踪(基本)
    (转)PBR路由策略配置
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10318281.html
Copyright © 2011-2022 走看看