集合的初始容量与性能

没事随便写写 :)

你知道当你写下下面这两句时这些数据结构的实际长度吗?

ArrayList list = new ArrayList();

Hashtable table 
= new Hastable();

你知道初始容量对今后的操作有什么性能上的影响吗?如果你不知道,让我来告诉你,因为我研究过了。

ArrayList与List<T>

  • .NET Framework 1.x中的ArrayList默认初始容量为16。今后当容量不够时,内部数组的长度会乘以2。
  • .NET Framework 2.0中的List<T>默认初始容量为4,但是实例后是0,因为它是lazy initialization,当你第一次调用Add或相关方法时才会初始为长度4。今后当容量不够时,内部数组的长度会乘以2。

也就是说,容量越大,需要resize的次数越少,性能也就越高,占用的空间也相对的大。建议你用平均数据量来设置初始容量。所谓平均数据量指在一次一般性操作中会有多少数据插入进list。

Hashtable与Dictionary<K, V>
  • .NET Framework 1.x中的Hashtable默认初始容量为7,实际为长度11。如果你对Hashtable不了解的话可能会问:“初始为7实际为11?!什么意思?”说来话长,简单地说,就是为了性能,我们插入进Hashtable的元素数量永远都只有它内部数组长度的一部分,至于这一部分到底是多少,是由它的load factor来决定的。这个load factor默认为0.72,是微软找出的最佳百分比,建议采用。所以默认容量为7但实际上数组长度为11(0.72 * 11)。当今后容量不够时,也就是当元素数量要大于等于容量时(默认的话也就是第一次要大于等于7时),Hashtable的内部数组会乘以2后找出相邻的更大质数作为新的容量(注意11是最小的质数容量)。
  • .NET Framework 2.0中的Dictionary<K, V>默认初始容量为3,同List<T>一样,是lazy initialization。因为与Hashtable实现不同,所以没有load factor这个概念。当今后容量不够时,内部的数组长度会乘以2后找出相邻的更大质数作为新的容量(注意3是最小的质数容量)。

同样,容量越大,需要resize的次数越小,性能也就越高,占用的空间也相对的大。像Hashtable与Dictionary这种map型的数据结构与list这种结构不同,resize需要做的事情比较多,也就是性能消耗要比list的高,所以初始容量通常设的大一点会比较好。

Dictionary<K, V>因为在处理Collision上要比Hashtable的高明,所以在检索性能上要比Hashtable高,建议在.NET 2.0下使用。

posted @ 2005-10-15 11:53  Cavingdeep  阅读(2327)  评论(3编辑  收藏  举报