Eqatec 显示每次调用方法时都会调用数千个匿名方法闭包,该方法在我的程序中包含一个简单的 LINQ 'Where' 语句。伪代码示例:
Class1
{
//foo and bar are both EF model classes
List<foo> aList; // n = 2000
List<bar> bList; // n = ~4000
void aMethod()
{
foreach (var item in aList)
{
Class2.DoSomeWork(item, bList);
}
}
}
Class2
{
static void DoSomeWork(foo item, List<bar> bList)
{
var query = bList.where(x => x.prop1 == item.A && x.prop2 = item.B).toList(); // <--- Calls thousands of anonymous method closures each method call.
if (query.any()) <--- Calls only 1 anonymous method closure.
DoSomethingElse();
}
}
我不明白为什么对“DoSomeWork”的 2,000 次调用调用了大约 800 万个匿名方法闭包(甚至 1 个导致数千个)。
作为修复,我只是简单地重写了语句而不使用 LINQ,它消除了对闭包的需要,并产生了 10 倍的性能提升。
如果有人有一些他们想分享的理论,我仍然想了解为什么会发生这种情况。