ArrayList容量,哪个更好? C#

时间:2012-07-04 12:36:29

标签: c# arraylist capacity

我今天的输入大约是450,未来可能会增加。 (有时它运行时少于450,可能是100或20)

对我来说更好:

  • 未设置容量
  • 设置容量低(100)
  • 设定容量小于450
  • 设定容量超过450
  • 将容量设定为高于450
  • 将容量设置为高于预期的容量(多80%?,两次?)

使用n作为增加的数量(不是实际的复杂性) 我认为将它设置为低于预期n = 440或者某些东西会给我“复杂性”n + 2n =(3n)

然而,如果我把它略高于(n = 460)将只给出

如果我设置n = 800给我一个高n(差不多2n)(高但我用TrimToSize让它更好?

什么是最佳选择?

4 个答案:

答案 0 :(得分:6)

我会说实话,我对所有关于n的讨论都进行了掩饰,因为我认为它会降低真实点,即相对效率。

“最佳选择”是使用System.Collections.Generic.List<T>,将其初始化为合理的内容然后不要担心,直到分析告诉您这是一个问题。

使用通用列表可以为您提供强大的打字支持,并且使用值类型可以避免装箱问题。

如果列表大小不断变化,或者列表不能存活很长时间,修剪它将不会提供太多改进(如果有的话)。如果您了解所涉及的大小的某些内容,则可以使用具有初始容量的重载构造函数来保存一些重新分配:

var list = new List<int>(450);

在初始容量被命中后,列表将继续使用它自己的内部逻辑调整大小以决定要抓取多少(默认情况下,如果你没有指定大小是要加倍大小:从4开始,然后8,16,32等。

答案 1 :(得分:3)

  • 使用这些数字(<1000),这无关紧要。

  • 没有初始容量,您将增加8,16,32,64等log(n)重新分配。

因此,只需使用有点靠近目标的任何值。这里有400和800一样好。您可能会重新分配一次,并且几乎 N的空间过冲是不可避免的。

答案 2 :(得分:1)

ArrayList适用于.net 1.1

你可以使用List<T>是一个通用类。

它支持存储特定类型的值,而无需装箱和从对象中取消装箱。 ArrayList只存储对象引用。

  1. 使用List避免Boxing /拆箱操作,这样可以节省你的记忆时间。

答案 3 :(得分:0)

您是否有理由不能使用通用列表?这将扩展/收缩到您需要存储的元素数量。如果你必须使用一个数组,那么我会将它设置为你可以预期的最大值的两倍(即800),因为这是一个相对较小的数字。对于数字,这将是分配的一小部分内存。