列表.添加数组和列表的adrange性能

本文关键字:列表 adrange 性能 添加 数组 | 更新日期: 2023-09-27 18:12:32

使用List.AddRange()时,添加ListArray在性能上有什么区别?

MyList.AddRange(MyArrayof1000ComplexElements);

MyList.AddRange(MyListof1000ComplexElements);

还是没有区别?

列表.添加数组和列表的adrange性能

因为数组和列表都实现了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)。