预置列表 c#
本文关键字:列表 | 更新日期: 2023-09-27 18:34:11
我正在使用c#,我正在创建一个列表(newList(,我可以从另一个列表(otherList(的长度中获取。在 c# 中,列表的实现方式是预分配列表的长度对使用 otherList.Count 的性能更好,还是只使用 newList.Add(obj( 而不用担心长度?
实现以下 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
那么预分配值得吗?如果列表中的对象数已知,或者此数字的底线已知(列表至少有多少项(,则为"是"。
否则,您可能会冒着浪费更多时间和内存的风险,因为预分配将使用时间和内存为所需的分配腾出空间。
请注意,在内存方面,精确预分配是内存效率最高的,因为不预分配会使列表在最紧张的所需容量上增长。