【发布时间】:2011-01-06 18:38:08
【问题描述】:
大家好
在下面的代码中
public class Person
{
public string Name { get; set; }
public uint Age { get; set; }
public Person(string name, uint age)
{
Name = name;
Age = age;
}
}
void Main()
{
var data = new List<Person>{ new Person("Bill Gates", 55),
new Person("Steve Ballmer", 54),
new Person("Steve Jobs", 55),
new Person("Scott Gu", 35)};
// 1st approach
data.Where (x => x.Age > 40).ToList().ForEach(x => x.Age++);
// 2nd approach
data.ForEach(x =>
{
if (x.Age > 40)
x.Age++;
});
data.ForEach(x => Console.WriteLine(x));
}
在我的理解中,第二种方法应该更快,因为它遍历每个项目一次,第一种方法运行 2 次:
- Where 子句
- ForEach 在 where 子句中的项目子集上。
但是在内部,编译器可能会将第一种方法转换为第二种方法,并且它们将具有相同的性能。
有什么建议或想法吗?
我可以按照建议进行分析,但我想了解编译器级别的情况,如果代码行与编译器相同,或者编译器会按字面意思对待它。
提前感谢您的帮助。
【问题讨论】:
-
profiling...用秒表进行测量,看看哪个更快
-
你能不能只计时看看哪个更快?
-
ps。从技术上讲,第二种方法(列表中的 ForEach)不是 Linq,因为它是 List 类上的直接方法,将委托作为参数。
-
一个比我聪明得多的人曾经说过“你已经用两种方式编写了它,自己测试一下,确定是否存在相关的、可证明的差异。”
-
如果您为
IEnumerable创建了一个ForEach扩展方法,那么您可以删除ToList,它们将是相同的。
标签: c# .net linq performance compiler-construction