【问题标题】:Code performance on double for loop compare to linq/lambda双 for 循环的代码性能与 linq/lambda 相比
【发布时间】:2016-08-26 17:32:18
【问题描述】:

我喜欢 linq/lambda 语句的外观,想知道它的性能

var temp = list1.ForEach(x => list2.ForEach(y => Tuple.Create(y[1]+" "+y[2]+" "+x[0]+" "+x[1]) );

与此相比:

foreach(var x in list1)
  foreach(var y in list2)
    var temp = Tuple.Create(y[1]+" "+y[2]+" "+x[0]+" "+x[1]);

仍然不熟悉人们如何用 O(nlogn) 来描述性能,但从与此类聊天的持续互动中,我了解到双循环通常给出 O(n^2)

【问题讨论】:

  • 两个不同的代码集执行相同吗?
  • 两者都有两个嵌套的 for 循环。两者都相同(在性能方面)
  • 这段代码中没有 LINQ。
  • 您如何得出结论,您的任何方法都可能是O(n log n)?或者这只是一个例子?
  • @Servy 好的。我仍然不熟悉这些术语。比如第一个代码叫什么?我也知道有什么查询与方法术语,以及语句与表达式。

标签: c# performance linq for-loop lambda


【解决方案1】:

两个语句的复杂性相同,即O(n^2)。在内部,ForEach-statement 将创建一个简单的循环,执行由 lambda-statement 确定的操作。因此,对内部代码的调用总数是相同的,这使得两种方法的复杂性相似。

无论如何,要在您的实际时间性能上获得有意义的结果,您应该使用一些分析工具,例如Resharper。或者,只需将一些 Stopwatch 语句添加到您的代码中,以衡量事情需要进行多长时间。

【讨论】:

  • 该死的,你在我写的时候打败了我>.
  • 我?那个选项在哪里?
【解决方案2】:

当编译器将这些转换为机器可读的代码时,两者都在执行相同的功能。无论哪种方式,这种特定情况都只是一个嵌套循环。我相信两者都应该是 O(n^2) ,这取决于你认为在这种情况下看起来更好。因为你有list1.foreach,那么在list2.foreach里面就和写一样

foreach()
{
    foreach()
    {
    }
}

【讨论】:

  • 好答案。
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2019-11-21
  • 2017-03-01
  • 2011-04-28
  • 2012-11-18
  • 2013-03-06
  • 2017-09-19
  • 2012-08-06
相关资源
最近更新 更多