customers对象有30,000条记录,Orders对象有20,000条记录。左连接使用每个比使用linq的组连接慢4秒。我有两个问题:
如何在不使用linq的情况下加快速度?
foreach (Customer c in Customers) {
foreach (Order o in Orders) {
if (c.ID == o.OwnerID) {
c.OrderName = o.OrderName;
break;
}
}
}
答案 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}对于大数据列表来说要快得多。