日期:2014-05-17  浏览次数:20980 次

遍历Dictionary跟List<T>的性能问题
今天在遍历

Dictionary<Guid,int>List<T>的时候(数据大概都有6000条,5个线程在跑)

发现遍历List<T>的速度比遍历Dictionary<Guid,int>快得不少.

为什么会这样呢,不是很明白?

特来请教!



------解决方案--------------------
看某博客的解释
http://www.wpf123.com/news/?7093.html
5. 问题剖析

同样是集合,为什么性能会有这样的差距。我们要从存储结构和操作系统的原理谈起。

首先我们清楚List<T>是对数组做了一层包装,我们在数据结构上称之为线性表,而线性表的概念是,在内存中的连续区域,除了首节点和尾节点外,每个节点都有着其唯一的前驱结点和后续节点。我们在这里关注的是连续这个概念。

而HashTable或者Dictionary,他是根据Key而根据Hash算法分析产生的内存地址,因此在宏观上是不连续的,虽然微软对其算法也进行了很大的优化。

由于这样的不连续,在遍历时,Dictionary必然会产生大量的内存换页操作,而List只需要进行最少的内存换页即可,这就是List和Dictionary在遍历时效率差异的根本原因。

6. 再谈Dictionary

也许很多人说,既然Dictionary如此强大,那么我们为什么不用Dictionary来代替一切集合呢?

在这里我们除了刚才的遍历问题,还要提到Dictionary的存储空间问题,在Dictionary中,除了要存储我们实际需要的Value外,还需要一个辅助变量Key,这就造成了内存空间的双重浪费。

而且在尾部插入时,List只需要在其原有的地址基础上向后延续存储即可,而Dictionary却需要经过复杂的Hash计算,这也是性能损耗的地方。

------解决方案--------------------
Dictionary的逻辑结果要复杂些,不能这样比较

如果是获取单条记录,你会发现Dictionary明显比List有优势