列表.添加数组和列表的adrange性能
本文关键字:列表 adrange 性能 添加 数组 | 更新日期: 2023-09-27 18:12:32
使用List.AddRange()
时,添加List
和Array
在性能上有什么区别?
MyList.AddRange(MyArrayof1000ComplexElements);
和
MyList.AddRange(MyListof1000ComplexElements);
还是没有区别?
因为数组和列表都实现了ICollection<T>
,所以它使用相同的代码。它解析为调用Array.Copy(…)
http://referencesource.microsoft.com/mscorlib/系统/收藏/一般/list.cs # e569d850a66a1771 #引用
List<T>
和T[]
之间没有区别- AddRange
对实现ICollection<T>
的任何内容使用相同的处理,这两者都是这样做的。
Array和List都实现了ICollection<T>
接口。因此,所使用的List.AddRange
的实现将是相同的,并将提供相同的性能。
在将来,您可以使用Stopwatch
类来计时,或者下载像JetBrain的dotPeek这样的工具来自己检查框架代码。
这是一个比一些评论所暗示的更有趣的问题。
碰巧,对于这个特定的列表/数组实现,答案是:没有区别。两者都依赖于相同的集合接口。
但它不一定是那样的。如果列表被实现为双链表(在许多其他情况下都是这样),那么将一个列表添加到另一个列表是O(1),而将数组添加到列表是O(n)。
我不会从基准测试开始解决这个问题。基准测试要做得好是很耗时的,而且很容易产生容易被误解的结果。在这种情况下,仔细研究实现和底层源代码(很容易通过. net反汇编器获得)将更快地回答这个问题。然后进行基准测试以确认是否足够重要。
请注意,这里应用的特定O(1)优化仅在MyListof1000ComplexElements
也是List时可用。如果是某种枚举器或链表,那么性能将是O(n)。
对于那些批评这个答案的人,请注意,它的写作目的是强调给出的其他答案是基于对问题的特定解释。他们没有指出他们对问题的解释有多狭隘,他们的答案适用的范围有多狭隘。另一个读者可能很容易忽略这个事实,即这个答案只适用于这种特定的情况,如果他们没有这样说的话。我的目的只是指出,在许多其他密切相关的情况下,这是一个O(n)操作,而不是O(1)。