0

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

对我来说更好:

  • 未设置容量
  • 将容量设置为低 (100)
  • 设置容量略小于 450
  • 设置容量略高于 450
  • 将容量设置为 450 以上
  • 将容量设置为超出预期(80% 以上?,两次?)

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

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

另外,如果我设置 n = 800 给我一个高 n(几乎 2n)(高但我使用 TrimToSize 让它变得更好?

什么是最好的选择?

4

4 回答 4

6

老实说,我忽略了所有关于 n 的讨论,因为我认为它偏离了真正的观点,即相对效率。

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

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

如果列表大小不断变化,或者列表不会持续很长时间,那么修剪它不会带来太大的改进(如果有的话)。如果您知道所涉及的大小的某些事情,则可以通过使用具有初始容量的重载构造函数来节省一些重新分配:

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

达到初始容量后,列表将继续使用它自己的内部逻辑调整大小,以决定要抓取多少(如果您不指定大小,则默认为双倍大小:从 4 开始,然后是 8、16 , 32 等)。

于 2012-07-04T12:39:19.540 回答
3
  • 有了这些数字 (< 1000) ,这并不重要。

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

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

于 2012-07-04T12:38:56.153 回答
1

ArrayList 适用于 .net 1.1

你可以使用List<T>的是一个泛型类。

它支持存储特定类型的值,而无需对对象进行装箱和拆箱。ArrayList 只是存储对象引用。

  1. 使用 List 避免装箱/拆箱操作,节省您的内存 n 时间。
于 2012-07-04T12:40:38.570 回答
0

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

于 2012-07-04T12:41:14.643 回答