【C#食谱】【面食】菜单4:List和LinkedList性能比较

摘要:
首先,先说明一下,LinkedList其实是一个双向链表:一个LinkedList对象其实就是一系列LinkedListNode对象的集合。每一个LinkedListNode对象都可以访问下一个和前一个LinkedListNode对象,其值是通过value属性访问的。现在,开始我们的性能比较:List类的性能优于LinkedList类。增加删除在List中增加、删除节点的速度,大体上快于使用LinkedList时的相同操作。注意,List.Insert*方法比在LinkedList中使用Add*方法在任何地方添加一个节点可能要慢。而在LinkedList中,却没有这样的奢侈品。
首先,先说明一下,LinkedList<T>其实是一个双向链表:
【C#食谱】【面食】菜单4:List和LinkedList性能比较第1张
一个LinkedList<T>对象其实就是一系列LinkedListNode<T>对象的集合。每一个LinkedListNode<T>对象都可以访问下一个和前一个LinkedListNode<T>对象,其值是通过value属性访问的。
现在,开始我们的性能比较:List<T>类的性能优于LinkedList<T>类。
增加 删除
在List<T>中增加、删除节点的速度,大体上快于使用LinkedList<T>时的相同操作。将 List<T>.Add方法和LinkedList<T>的Add*方法相比较,真正的性能差别不在于Add操作,而在LinkedList<T>在给GC(垃圾回收机制)的压力上。一个List<T>本质上是将其数据保存在一个堆栈的数组上,而LinkedList<T>是将其所有节点保存在堆栈上(人家是一个,我是一系列)。这就使得GC需要更多地管理堆栈上LinkedList<T>的节点对象。注意,List<T>.Insert*方法比在LinkedList<T>中使用Add*方法在任何地方添加一个节点可能要慢。然而,这个依赖于List<T>插入对象的位置。Insert方法必须使所有在插入点后面的元素往后移动一位。如果新元素被插在List<T>最后或接近最后的位置,那么相对于GC维护LinkedList<T>节点的总的开销来说,其开销是可以被忽略的。
索引
另一个List<T>性能优于LinkedList<T>的地方是你在使用索引进行访问的时候。在List<T>中,你可以使用索引值(indexer)直接定位到某个具体的元素位置。而在LinkedList<T>中,却没有这样的奢侈品。在LinkedList<T>中,你必须通过Previous或Next属性遍历整个List,直到找到你想要的节点。

搜索 查找

在搜索某个元素或节点的时候,List<T>的性能也优于LinkedList<T>。相比于LinkedList<T>的Contains,Find,和FindLast方法,List<T>.BinarySearch方法在找元素方面更快。这次因为LinkedList<T>使用的是线性查找,而List<T>使用的是Binary Search。简单地说,Binary Search利用List<T>中的元素已排过序,这需要在调用BinarySearch方法之前先调用Sort方法(请注意,如果有任何新的元素被添加进来,那么Sort方法必须被重新调用)。接下去的查找就是Binary Search的算法了,我就不再赘述了!

免责声明:文章转载自《【C#食谱】【面食】菜单4:List和LinkedList性能比较》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Lucene架构idea git 配置代理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

background:url 的使用方法

1#pingfenli{227px;3float:left;4height:28px;5cursor:pointer;6background:urlno-repeat00;7list-style:none;8}background:url的使用方法,后面的两个数字代表的是图片在屏幕上显示的位置。...

【转载】SecureCRT配色推荐和永久设置

2.配置文件夹和其他颜色选项==“全局选项==”终端==“外观==”ANSI颜色单击第二行中的第五个色块以修改文件夹颜色:对第二个色块执行相同的操作以修改压缩包和jar包的颜色:如果设置后文件夹和其他的颜色无效,您可以对第二行中设置背景色和字体颜色的颜色块执行相同的操作!...

backgroundsize

当背景大小值为和时,可以设置两个值,也可以设置一个值。当只取一个值时,第二个值相当于auto,但此处的auto不会将背景图像的高度保持在其原始高度,而是与第一个值相同。此外,如果只取一个值,宽度和高度将相同,这相当于背景大小:80%自动。...

内网esxi磁盘空间不足导致虚拟机宕机

因为一些占用太多空间的虚拟机可能无法启动。我不断拍摄快照以保存测试版本。我跳过了同一网段上的一个虚拟机ssh,并一直看着翻译器学习如何释放虚拟磁盘空间。您只能创建一个新的虚拟机来读取原始磁盘目录,并且只能重新构建一个新Linux机器进行测试。然后上传一个测试文件(最大程度地模拟其他虚拟机环境)。首先,你需要关闭机器。厚配置延迟将整个虚拟机目录文件清零,如下所...

Linux系统添加永久静态路由的方法

按照Linux启动的顺序,rc本地的内容在Linux中的所有服务启动后执行。也就是说,local的内容在netfs之后执行。也就是说,当netfs启动时,不会添加服务器上的静态路由,因此无法成功装载netfs。...

C# 没落了吗?

首先,这个数字--------------------------------------------C#是否正在衰落与微软的整个平台密切相关。近年来,使用C#的人越来越少,这也是因为越来越少的人专门为Microsoft平台开发产品。现在是移动时代,微软基本上错过了互联网和移动互联网这两波浪潮。现在生活不容易。在软件工程中,人们常说“唯一不变的就是改变本身”...