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的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
随机推荐
- Jquery14 工具函数
学习要点: 1.字符串操作 2.数组和对象操作 3.测试操作 4.URL 操作 5.浏览器检测 6.其他操作 工具函数是指直接依附于 jQuery 对象,针对 jQuery 对象本身定义的方法,即全局 ...
- C#API函数
API函数是构筑Windows应用程序的基石,是Windows编程的必备利器.每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法,或者是调用Windows A ...
- servlet初始化参数
使用<context-param>标签初始化的参数是被应用程序中所有的servlet所共享.但是有时候我们需要为某一个特定的servlet配置参数,这个时候我们就需要使用servlet初始 ...
- lucene介绍和存储介绍
全文检索基础 1. Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹.搜索的范围是整个电脑中的文件资源. 2. 在BBS.BLOG.新闻等系统 ...
- 探索C++虚函数
探索C++虚函数 1 测试环境 各个编译器对虚函数的实现有各自区别,但原理大致相同.本文基于VS2008探索虚函数 2 测试代码 #pragma once #include <iostream& ...
- 在阿里云服务器上搭建 Apache Tomat 应用
在阿里云上购买一台服务器,系统采用 window 2008 Server 企业版,64位 1.下载Java7 JRE,安装 http://www.java.com/zh_CN/download/man ...
- java网络编程之图片上传
输入输出流核心代码 所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中. InputStream in = 输入源; OutputStream os = ...
- Python之路day13 web 前端(JavaScript,DOM操作)
参考链接:http://www.cnblogs.com/wupeiqi/articles/5433893.html day13 1. CSS示例 2. JavaScript 3. DOM操作 上节内容 ...
- Neutron之OVS
OVS即开放虚拟交换标准,不仅仅是为了支持OpenFlow协议,而是为了给虚拟化平台上运行的虚拟机实例提供一套纯软件实现的路由交换协议栈.具体点说,Open vSwitch是在开源的Apache2.0 ...
- JavaScript---forEach( ) 、map( )和 filter()
循环数组,最先想到的就是for循环: for(var i=0;i<count;i++) { //逻辑代码} 除此之外,就是forEach()方法了. Firefox 和Chrome 的Arra ...