指定集合的​​初始容量是最佳做法吗?

时间:2009-01-08 20:26:06

标签: .net collections

.Net中的许多集合类(即List< T>,Dictionary< TKey,TValue>)都有一个重载的构造函数,可以指定初始容量大小。使用此构造函数是最佳做法吗?如果是这样,他们应该使用某种“魔数”吗?这是一回事如果我提前知道确切的尺寸,但如果我不知道怎么办?

2 个答案:

答案 0 :(得分:4)

  

使用此构造函数是最佳做法吗?

当然。在处理大量数据时,这可以使应用程序更加高效,因为它可以有效地防止在连续填充容器时重复分配和复制大数据批。

使用List数据结构提供示例:

在这两种情况下,插入实际上具有相同的摊销常量运行时。这意味着无论容器大小如何,Add操作都将花费一个恒定的时间。但是,这只是平均值。如果容器必须在内部调整大小,否则会溢出,这一个Add操作实际上需要O( n ),即它的时间与容器的大小成正比。

在许多添加元素的过程中,这并不重要,但对于大型 n ,如果用户界面冻结,则可以为用户感知单个插入操作 那段时间。

如果您从一开始就已经预留了足够大的容量,那么永远不会发生。

  

如果是这样,他们应该使用某种“幻数”吗?

没有。如果您知道(甚至近似)大小,请使用它。如果你不这样做,请不要打扰。这些容器的自动放大策略实际上相当不错,在大多数情况下猜测会更差(除非你有一个明智的猜测,但它根本就没有猜测,是吗?)。 / p>

答案 1 :(得分:1)

由于List<T>对象的大小增加2倍,因此指定初始大小在性能方面并不是非常重要,除非您知道该集合会变得非常大。在这种情况下,将集合初始化为大尺寸以避免重新调整大小可能是有意义的。

通常,如果我在创建之前确切知道我的集合的大小,我只需创建一个数组并将其作为IEnumerable<T>

返回