从cpu和内存来理解为什么数组比链表查询快

ArrayList和LinkList的比较

1.ArrayList和LinkedList可想从名字分析,它们一个是Array(动态数组)的数据结构,一个Link(链表)的数据结构,此外,它们两个都是对List接口的实现。前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列

2.ArrayList查询效率比LinkList高,因为查询时候LinkList需要移动指针一个个查找

3.LinkList新增和删除效率比ArrayList高,LinkList底层为双向链表结构,会记录前一个节点和后一个节点,所以新增时候与删除时候更快。

转载

一个常见的编程问题: 遍历同样大小的数组和链表, 哪个比较快? 如果按照大学教科书上的算法分析方法,你会得出结论,这2者一样快, 因为时间复杂度都是 O(n)。 但是在实践中, 这2者却有极大的差异。 通过下面的分析你会发现, 其实数组比链表要快很多。 
首先介绍一个概念:memory hierarchy (存储层次结构),电脑中存在多种不同的存储器,如下表

CPU 寄存器 – immediate access (0-1个CPU时钟周期) 
CPU L1 缓存 – fast access (3个CPU时钟周期) 
CPU L2 缓存 – slightly slower access (10个CPU时钟周期) 
内存 (RAM) – slow access (100个CPU时钟周期) 
硬盘 (file system) – very slow (10,000,000个CPU时钟周期) 
(数据来自 http://www.answers.com/topic/locality-of-reference

各级别的存储器速度差异非常大,CPU寄存器速度是内存速度的100倍! 这就是为什么CPU产商发明了CPU缓存。 而这个CPU缓存,就是数组和链表的区别的关键所在。

CPU缓存会把一片连续的内存空间读入, 因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面, 平均读取每个元素的时间只要3个CPU时钟周期。 而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)

因此,程序中尽量使用连续的数据结构,这样可以充分发挥CPU缓存的威力。 这种对缓存友好的算法称为 Cache-oblivious algorithm, 有兴趣可以参考相关资料。

总结一下, 各种存储器的速度差异很大,在编程中绝对有必要考虑这个因素。 比如,内存速度比硬盘快1万倍,所以程序中应该尽量避免频繁的硬盘读写;CPU缓存比内存快几十倍,在程序中尽量多加利用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值