简短问题:为什么LINQ比通过foreach循环聚合操作要慢?LINQ是否比聚合操作的foreach循环慢?
描述 -
我试图优化一些旧代码,并同时LINQ查询整个代码中广泛使用的,琐碎的操作,比如在Enumerable
数字总结使用循环完成。
因此,我跑了一些测试来比较两种方法的性能。 以下是使用LINQ的.Sum()
方法和使用foreach
循环计算总计1000个数字的总和并且手动总结每个发生的代码。
List<Double> numbers = new List<Double>();
Double[] sums1 = new Double[1000];
Double[] sums2 = new Double[1000];
for (int i = 0; i < 1000; i++)
{
numbers.Add(i * i);
}
Int64 startTime1 = Stopwatch.GetTimestamp();
for (int i = 0; i < 1000; i++)
{
Double sum = 0;
sum = numbers.Sum();
sums1[i] = sum;
}
Int64 endTime1 = Stopwatch.GetTimestamp();
Int64 startTime2 = Stopwatch.GetTimestamp();
for (int i = 0; i < 1000; i++)
{
Double sum = 0;
foreach (Double number in numbers)
{
sum += number;
}
sums2[i] = sum;
}
Int64 endTime2 = Stopwatch.GetTimestamp();
Console.WriteLine("LINQ. Start = {0}, End = {1}: Diff = {2}", startTime1, endTime1, endTime1 - startTime1);
Console.WriteLine("ForEach. Start = {0}, End = {1}: Diff = {2}", startTime2, endTime2, endTime2 - startTime2);
我跑这个测试一对夫妇(TEN)次,结果是:
LINQ. Start = 117385428996, End = 117385462197: Diff = 33201
Foreach. Start = 117385462203, End = 117385476329: Diff = 14126
LINQ. Start = 117385478555, End = 117385499802: Diff = 21247
Foreach. Start = 117385499808, End = 117385520756: Diff = 20948
LINQ. Start = 117385521426, End = 117385546256: Diff = 24830
Foreach. Start = 117385546260, End = 117385567052: Diff = 20792
LINQ. Start = 117385572791, End = 117385602149: Diff = 29358
Foreach. Start = 117385602156, End = 117385622367: Diff = 20211
LINQ. Start = 117385623153, End = 117385652563: Diff = 29410
Foreach. Start = 117385652568, End = 117385673733: Diff = 21165
LINQ. Start = 117385674403, End = 117385705028: Diff = 30625
Foreach. Start = 117385705035, End = 117385725552: Diff = 20517
LINQ. Start = 117385726094, End = 117385753161: Diff = 27067
Foreach. Start = 117385753166, End = 117385771824: Diff = 18658
LINQ. Start = 117385772341, End = 117385793726: Diff = 21385
Foreach. Start = 117385793733, End = 117385811332: Diff = 17599
LINQ. Start = 117385811768, End = 117385837204: Diff = 25436
Foreach. Start = 117385837209, End = 117385852670: Diff = 15461
LINQ. Start = 117385853003, End = 117385874410: Diff = 21407
Foreach. Start = 117385874416, End = 117385891874: Diff = 17458
注意,foreach
循环总是表现得更好。这可能是什么原因?
编辑:answer对此question有很多关于为什么性能可能会比常规内联操作更糟糕的很好的信息。但是我无法看到它在这里的确切关系。
[LINQ性能FAQ](http://stackoverflow.com/questions/4044400/linq-performance-faq) –
我加入'对(INT X = 0一看可能的复制; X <号码.Count; x ++)',它在LINQ和foreach之间 – mayu
顺便说一句。你编写日志'ForEach',结果包含'Foreach'。 Magic;) – mayu