【问题标题】:Why is List<T>.AddRange(IEnumerable<T>) faster than new List<T>(IEnumerable<T>)为什么 List<T>.AddRange(IEnumerable<T>) 比 new List<T>(IEnumerable<T>) 快
【发布时间】:2012-05-21 09:38:48
【问题描述】:

我听说List&lt;T&gt;.AddRange(IEnumerable&lt;T&gt;)new List&lt;T&gt;(IEnumerable&lt;T&gt;) 快。在查看反射器后,我无法解释为什么在创建测试应用程序后会出现广告。确实,我发现它更快。

有人知道为什么吗?

【问题讨论】:

  • 您能粘贴您的示例代码吗?它们的性能会因您传入的对象而异。
  • “我听说...” - 不要相信你听到的一切,尤其是关于性能的笼统陈述。
  • @Joe 它来自一个知道他的东西的人....
  • “它来自一个知道他的东西的人......” - 向权威提出上诉 (en.wikipedia.org/wiki/Appeal_to_authority) 并不令人信服。

标签: c# .net performance list ienumerable


【解决方案1】:

抱歉,我无法证实您的假设。 AddRange 总是比构造函数变体慢。

我为它做了一些测试代码:

a)var list = new List&lt;T&gt;(enumerable);

b)var list = new List&lt;T&gt;(); list.AddRange(enumerable);

用不同的 IEnumerables 测试

列表:新:32ms 添加范围:47ms

LinkedList:新:58ms addrange:99ms

HashSet:新:56ms addrange:98ms

队列:新:271ms addrange:516ms

【讨论】:

  • 我确信开销可以忽略不计。
  • 这不是 OP 所要求的。由于您将 List&lt;T&gt; 传递给构造函数,因此它可以简单地用于将其复制到新列表中,而传递 IEnumarable&lt;T&gt;(例如 Enumerable.Range(1,1000000))可能需要枚举必须被枚举并一一添加到新列表。除此之外,我认为您的示例中的差异无论如何都可以忽略不计。
  • 一个 IEnumerable 可以是所有不同的类型。这并没有忽视一个事实,即在这两种情况下,一个新的运算符都会增加额外的开销。我不知道他的假设是基于什么事实,即 AddRange 更快。我根本无法确认。
  • 只是猜测。也许构造函数取决于 Count 函数的努力,这对于列表来说很快。
  • 我得到了同样的结论,所以我很惊讶
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多