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。
golang slice 与list 的性能分析。的更多相关文章
- [Golang]字符串拼接方式的性能分析
本文100%由本人(Haoxiang Ma)原创,如需转载请注明出处. 本文写于2019/02/16,基于Go 1.11.至于其他版本的Go SDK,如有出入请自行查阅其他资料. Overview 写 ...
- golang slice 使用及源码分析
1.先做个小实验 func main(){ s1:=make([]int,0,10) s1=[]int{1,2,3} ss:=make([]int,0,10) ss = s1[1:] for i:=0 ...
- 记一次docker问题定位(perf,iostat等性能分析)
背景 最近参与的项目是基于 OpenStack 提供容器管理能力,丰富公司 IaaS 平台的能力.日常主要工作就是在开源的 novadocker 项目(开源社区已停止开发)基础上进行增强,与公司的其他 ...
- golang slice 切片原理
golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...
- golang slice 源码解读
本文从源码角度学习 golang slice 的创建.扩容,深拷贝的实现. 内部数据结构 slice 仅有三个字段,其中array 是保存数据的部分,len 字段为长度,cap 为容量. type s ...
- for-loop 与 json.Unmarshal 性能分析概要
原文地址:for-loop 与 json.Unmarshal 性能分析概要 前言 在项目中,常常会遇到循环交换赋值的数据处理场景,尤其是 RPC,数据交互格式要转为 Protobuf,赋值是无法避免的 ...
- 性能分析(7)- 未利用系统缓存导致 I/O 缓慢案例
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前提 前面有学到 Buffer 和 Cache 的 ...
- 如何进行python性能分析?
在分析python代码性能瓶颈,但又不想修改源代码的时候,ipython shell以及第三方库提供了很多扩展工具,可以不用在代码里面加上统计性能的装饰器,也能很方便直观的分析代码性能.下面以我自己实 ...
- SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
随机推荐
- Myeclipse中java项目转换为Web项目
https://blog.csdn.net/u010097777/article/details/51281059 这两天工作安排做一个跳转页面,不过昨天发布自己的Tomact花了不少时间,给的项目添 ...
- 【转载】解决window.showModalDialog 模态窗口中location 打开新窗口问题
来源: <http://bibipear.blog.sohu.com/143449988.html> 在我们的项目中,通常会用到showModalDialog 打开一个模态的子窗口,但是在 ...
- JDBC连接池&DBUtils
JDBC连接池 DBCP:Apache推出的Database Connection Pool 使用步骤: > 添加jar包 commons-dbcp-1.4.jar commons-pool ...
- mybatis中使用mysql的模糊查询字符串拼接(like)
方法一: <!-- 根据hid,hanme,grade,模糊查询医院信息--> 方法一: List<Hospital> getHospitalLike(@Param(" ...
- 线程实现Runnable接口比继承Thread的优势
1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...
- kylin入门到实战:cube详述
版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=306 排版乱?请移步原文获得更好的阅读体验 1.什么是cube? cube是所有dimession的组合,每一种 ...
- Caffe cpu版本 Linux配置命令及搭建
Caffee 安装过程 1.安装依赖包 $ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-de ...
- HDU5299 圆的扫描线 && 树上删边博弈
HDU5299 圆的扫描线 && 树上删边博弈 标签(空格分隔): 未分类 给出若干个圆,可以互相嵌套但不相交或相切. 每次删去一个圆和它内部的圆,进行博弈,问谁赢. 分成两部分.首先 ...
- brew 与 nvm
brew 与 nvm 是两个管理软件工具 今天更新了brew结果brew下安装的软件都找不着了.得重新安装,据说brew已经不再更新了.应该是通过github的吧. 结果得重装node与npm,这两 ...
- wamp升级php7
原文:http://blog.csdn.net/cheng6251/article/details/50730441 1.下载php7 http://windows.PHP.net/downloa ...