确定收集对象的初始容量的最佳方法是什么?

时间:2009-03-17 14:05:53

标签: c# collections

使用具有容量的对象时,您可以使用哪些指南来确保在使用集合时最有效?似乎.NET框架已经将这些容量设置得很低。例如,我认为StringBuilder的初始容量为16.这是否意味着在将16个字符串插入StringBuilder后,StringBuilder对象将被重新分配并加倍大小?

4 个答案:

答案 0 :(得分:4)

如果你知道一个集合或StringBuilder有多大,那么最好把它作为构造函数的容量传递给你。这样,只会进行一次分配。如果您不知道确切的数字,即使是近似值也会有所帮助。

答案 1 :(得分:2)

使用StringBuilder,它不是字符串的数量,而是字符的数量。一般来说;如果您可以预测长度,请继续告诉它 - 但由于它使用加倍,如果您需要使用Add等,则偶尔重新分配时不会有巨大的开销。 / p>

在大多数情况下,差异将是微不足道的和微观优化。没有告诉它的大小的最大问题是,除非集合有一个“修剪”方法,你可能几乎是你真正需要的尺寸的两倍(如果你非常不走运)。

答案 2 :(得分:2)

我只有两种情况可以明确设置集合的容量

  1. 我知道将在集合中显示的项目的确切数量,我正在使用数组或列表< T>。
  2. 我正在进入一个写入char []的函数,我正在使用StringBuilder与参数互操作。在这种情况下,您必须将CLR的容量设置为编组为本机代码。
  3. 有趣的是,对于#1,当我将从COM接口返回的数据复制到BCL集合类时,几乎总是这样做。所以我猜你可以说我只在互操作场景中这样做:)。

答案 3 :(得分:0)

说到StringBuilder,我敢用最坏的情况。 StringBuilder需要有条件的内存块,这很难在高度分散的堆上分配。

但我会考虑其他收藏品。