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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WindCoder

mybatis在xml文件中处理大于号小于号的方法(mybatis大于小于的转义)

SELECT * FROM test WHERE 1 = 1 AND start_date  &lt;= CURRENT_DATE AND end_date &...

991
来自专栏Android先生

Android开发人员不得不学习的JavaScript基础(二)

window对象是BOM的核心,window对象指当前的浏览器窗口,window对象中有很多种方法供开发者调用:

1003
来自专栏对角另一面

读Zepto源码之Selector模块

Selector 模块是对 Zepto 选择器的扩展,使得 Zepto 选择器也可以支持部分 CSS3 选择器和 eq 等 Zepto 定义的选择器。 在阅读本...

1950
来自专栏Golang语言社区

golang(Go语言) byte/[]byte 与 二进制形式字符串 互转

效果 把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如: byte(3) –> “00000011” []byte{1...

4407
来自专栏分布式系统和大数据处理

Go语言Tips

转型到Go以后,因为语言的不熟悉,以往很常见的一些操作有时候也需要去Google一下。这里将一些结果记录下来,方便日后查阅。

1342
来自专栏十月梦想

Vue入门详解之模板语法插值表达式,v-html和v-text

我们来看一下简单的模板语法,在Vue中有三种模板语法用来渲染model(数据层),插值表达式(就是{{}},双花括号表达法),v-text和v-html三种!那...

3283
来自专栏天天

微信小程序 页面与自定义组件数据通信

说明:页面通过my-property讲example字符串传递给自定义组件,同样也可以使用数据绑定的方法

3765
来自专栏移动开发面面观

React Native的props

1243
来自专栏偏前端工程师的驿站

JS魔法堂:元素克隆、剪切技术研究

一、前言                                     当需要新元素时我们可以通过 document.createElement 接口...

1785
来自专栏大前端_Web

jquery常用函数及技巧(持续更新)

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1221

扫码关注云+社区