.Net中的许多集合类(即List< T>,Dictionary< TKey,TValue>)都有一个重载的构造函数,可以指定初始容量大小。使用此构造函数是最佳做法吗?如果是这样,他们应该使用某种“魔数”吗?这是一回事如果我提前知道确切的尺寸,但如果我不知道怎么办?
答案 0 :(得分:4)
使用此构造函数是最佳做法吗?
当然。在处理大量数据时,这可以使应用程序更加高效,因为它可以有效地防止在连续填充容器时重复分配和复制大数据批。
使用List
数据结构提供示例:
在这两种情况下,插入实际上具有相同的摊销常量运行时。这意味着无论容器大小如何,Add
操作都将花费一个恒定的时间。但是,这只是平均值。如果容器必须在内部调整大小,否则会溢出,这一个Add
操作实际上需要O( n ),即它的时间与容器的大小成正比。
在许多添加元素的过程中,这并不重要,但对于大型 n ,如果用户界面冻结,则可以为用户感知单个插入操作 那段时间。
如果您从一开始就已经预留了足够大的容量,那么永远不会发生。
如果是这样,他们应该使用某种“幻数”吗?
没有。如果您知道(甚至近似)大小,请使用它。如果你不这样做,请不要打扰。这些容器的自动放大策略实际上相当不错,在大多数情况下猜测会更差(除非你有一个明智的猜测,但它根本就没有猜测,是吗?)。 / p>
答案 1 :(得分:1)
由于List<T>
对象的大小增加2倍,因此指定初始大小在性能方面并不是非常重要,除非您知道该集合会变得非常大。在这种情况下,将集合初始化为大尺寸以避免重新调整大小可能是有意义的。
通常,如果我在创建之前确切知道我的集合的大小,我只需创建一个数组并将其作为IEnumerable<T>