使用ToList()与使用new List(IEnumerable<T>)之间的性能差异

10

我对在IEnumerable上使用ToList()与仅调用List构造函数'List(IEnumerable)'的性能影响很感兴趣。

示例:

int[] testArray = new int[10];
var list = testArray.ToList();

对决。

int[] testArray = new int[10];
var list = new List<int>(testArray);

在使用其中一种方式时是否会有性能影响或最佳做法?

我接手了一个应用程序,其中我的控制器方法返回一个数组,但我的视图需要一个List。


即使有(我非常怀疑),它几乎肯定不会成为您程序的瓶颈。 - KChaloux
是的,我并不指望性能会受到很明显的影响,如果有的话,但我一直在寻找提高性能的方法,因为我正在处理每天数百万次点击的系统,性能是一个问题。如果没有性能问题,那么是否至少有最佳实践可用? - Loren Shaw
10
优先编写简介。始终优先编写简介。最佳实践可能是在代码上下文中更易读的方式。 - user289086
我会使用 ToList,因为它适用于许多不同的 IEnumerable 类型。这使您可以在将来更改测试数组为不同的可枚举类型(如果您选择这样做),从而减少代码的脆弱性。我还发现 ToList 的语法比构造函数参数更明显。 - Matthew
1
此问题似乎与主题无关,因为答案取决于实现的具体细节。 - user1345223
显示剩余4条评论
1个回答

7
像其他人已经说过的那样,大多数情况下最佳实践是做更易读的事情(这里指使用 ToList())。两种方式完全相同,所以您应该期望它们的性能非常相似。
如果分析表明这是您需要优化的代码,则应尝试两种方法并测量哪种方法更快。
查看源代码(在 .Net 基库的情况下,您可以查看 参考源代码 或使用反编译器)也可能有所帮助。 ToList 看起来像这样:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    return new List<TSource>(source);
}

因此,它的性能应该与new List相同,只是多了一个null检查和一个方法调用。但这两个附加功能都可能被优化掉。

2
包含 throw 语句的方法不会被优化掉。这样做会对异常的堆栈跟踪产生过大的干扰。 - Hans Passant
1
仍然归结为“两者几乎相同”。 - scrwtp
1
谢谢。实际上,我自己已经做了空值检查。我将记住,在以后的工作中,基本上需要决定是否需要空值检查以及哪种格式更适合我正在处理的代码。 - Loren Shaw
@DanielShaw 嗯,new List 也会自行进行 null 检查。因此从这个角度来看也无关紧要。 - svick
@bashis 这很奇怪。你确定你在正确地测量它吗?请记住,编写正确的微基准测试确实很困难。 - svick
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接