为什么在这个例子中LINQ更快

我写了以下内容来测试使用foreach vs LINQ的性能:

 private class Widget { public string Name { get; set; } } static void Main(string[] args) { List widgets = new List(); int found = 0; for (int i = 0; i  a.Name.StartsWith("4")).Count(); Console.WriteLine(found + " - " + DateTime.Now.Subtract(starttime).Milliseconds + " ms"); Console.ReadLine(); } 

我得到类似以下输出:

 31160  -  116ms
 31160  -  95毫秒

在每次运行中,LINQ都比foreach高出约20%。 据我所知,LINQ扩展方法使用了标准的c#。

那么为什么LINQ在这种情况下会更快?

编辑:

所以我改变了我的代码,使用秒表而不是datetime,仍然得到相同的结果。 如果我首先运行LINQ查询,那么我的结果显示LINQ比foreach慢约20%。 这必须是某种JIT暖机问题。 我的问题是如何在我的测试用例中补偿JIT热身?

这是因为你没有热身。 如果你扭转案件,你会得到相反的结果:

 31272 - 110ms 31272 - 80 ms 

开始添加预热并使用秒表以获得更好的计时。

用热身运行测试:

  //WARM UP: widgets.Where(a => a.Name.StartsWith("4")).Count(); foreach (Widget w in widgets) { if (w.Name.StartsWith("4")) found += 1; } //RUN Test Stopwatch stopwatch1 = new Stopwatch(); stopwatch1.Start(); found = widgets.Where(a => a.Name.StartsWith("4")).Count(); stopwatch1.Stop(); Console.WriteLine(found + " - " + stopwatch1.Elapsed); found = 0; Stopwatch stopwatch2 = new Stopwatch(); stopwatch2.Start(); foreach (Widget w in widgets) { if (w.Name.StartsWith("4")) found += 1; } stopwatch2.Stop(); Console.WriteLine(found + " - " + stopwatch2.Elapsed); 

结果:

 31039 - 00:00:00.0783508 31039 - 00:00:00.0766299 

我做了一段时间的分析,比较以下内容:

  • 具有/不具有正则表达式的对象的LINQ

  • 带/不带正则表达式的Lambda表达式

  • 带/不带正则表达式的传统迭代

我发现LINQ,Lambda和Traditional迭代总是相同,但真正的时间差异在于Regex表达式。 只添加正则表达式使得评估更慢(LOT更慢)。 (详情请见: http : //www.midniteblog.com/?p = 72 )

您在上面看到的可能是因为您在同一代码块中进行了两个测试。 尝试评论一个,计时,然后评论另一个。 此外,请确保您正在运行发布版本,而不是在调试器中。