预置列表 c#

本文关键字:列表 | 更新日期: 2023-09-27 18:34:11

我正在使用c#,我正在创建一个列表(newList(,我可以从另一个列表(otherList(的长度中获取。在 c# 中,列表的实现方式是预分配列表的长度对使用 otherList.Count 的性能更好,还是只使用 newList.Add(obj( 而不用担心长度?

预置列表 c#

实现以下 List<T> 构造函数的目的是提高类似方案中的性能:

http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx

public List(int capacity)

只需在构造函数中传递容量即可。

newList = new List<string>(otherList.Count);

如果您知道新列表的确切长度,那么使用该容量创建它确实执行 - 有点 - 更好。

原因是List<T>内部的实现使用数组。如果此值太小,则会创建一个新数组,并将旧数组中的项复制到新项中。

取自 MSDN 上的"备注"部分

List<T>的容量是List<T>的元素数 能憋得住。当元素被添加到List<T>时,容量会根据需要通过重新分配内部阵列自动增加。

如果可以估计集合的大小,则指定初始容量时无需在向List<T>添加元素时执行许多调整大小操作。

可以通过调用 TrimExcess 方法或通过以下方式减少容量 显式设置"容量"属性。减少容量 重新分配内存并复制List<T>中的所有元素。

因此,这表明,如果您对要填充的列表的大小有一个估计值,则会提高性能。当然,这样做的另一面是分配的列表大小太大,因此不必要地耗尽内存。

老实说,除非我真的需要,否则我不会担心这种微观优化。

所以我对预分配的场景进行了基准测试,只是想分享一些数字。代码只是简单地计时:

var repetitions = 100000000
var list = new List<object>();
for (var i = 0; i < repetitions; i++)
    list.Add(new object());

比较是通过在列表中分配确切的重复次数,两倍的数量并且没有预分配。这是时代:

  • 未预先分配的列表:6561、6394、6556、6283、6466
  • 预分配列表:5951、6037、5885、6044、5996
  • 列表双重预分配:6710、6665、6729、6760、6624

那么预分配值得吗?如果列表中的对象数已知,或者此数字的底线已知(列表至少有多少项(,则为"是"。

否则,您可能会冒着浪费更多时间和内存的风险,因为预分配将使用时间和内存为所需的分配腾出空间。

请注意,在内存

方面,精确预分配是内存效率最高的,因为不预分配会使列表在最紧张的所需容量上增长。