为什么在这个例子中For Each循环比linq的外连接慢?

时间:2017-03-25 19:11:16

标签: c# linq

customers对象有30,000条记录,Orders对象有20,000条记录。左连接使用每个比使用linq的组连接慢4秒。我有两个问题:

  1. 这是什么原因?
  2. 如何在不使用linq的情况下加快速度?

    foreach (Customer c in Customers) {
        foreach (Order o in Orders) {
            if (c.ID == o.OwnerID) {
                c.OrderName = o.OrderName;
                break; 
            }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

Processing a sorted array is always faster。 (这可能是stackoverflow中最受欢迎的答案之一)。这个问题与硬件有关,但软件也从中获益。

对两个数组进行排序。

现在从外循环的最新索引(等于ownerid)开始内循环,相当于内循环索引,而不是零。您已经提前退出,因此总体复杂度为

O(small) + O(small) instead of O(bruteforce)
sorting    nested loop         nested loop unsorted

如果你有时间,你可以安装arrayfire(C ++)并获得一些包装它以在C#中用于这些强力计算。只有这个作弊会比linq加入小型(30k-100k)阵列更好。

当元素数量达到数百万且算法变得非常重要时,作弊会消失,除非你有3-4个高端gpus。然后它会停留在30M左右,然后算法会再次闪耀,除非你有一个集群,但如果你有集群,那么不使用高级算法将是一种浪费。

当使用CPU时,Best是C#自己实现的。与Ivan Stoev的注释一样,良好的哈希函数优于排序。

答案 1 :(得分:-1)

我不知道你为什么要避免使用linq,使用两个嵌套的function myFunction() { var myNumber = 2; var txt = 10; var output = ""; while (myNumber != Infinity) { myNumber = myNumber * myNumber; txt = txt + myNumber; output = output + txt + "<br>"; } document.getElementById("demo").innerHTML = output; } 循环并不总是一个好习惯,但是,尝试使用for each循环而不是{{1}对于大数据列表来说要快得多。