在紧凑框架3.5应用程序中优化其中一个较大的表单时,我们注意到在加载包含lambda表达式的表单时会出现重大性能损失。只有在发布模式下在设备上运行应用程序时才会注意到这一点。
当表单包含以下代码时:
foreach (MyObject in objects.OrderBy(x => x.id))
该类的基础构造函数执行(取决于硬件)的时间比可能的等效时间长几秒:
foreach (MyObject in objects.OrderBy(FunctionPointerInsteadOfLambda))
...
private string FunctionPointerInsteadOfLambda(MyObject obJ) {
return obj.Id;
}
我的理解是lambda编译为匿名方法,这将为该类的方法槽表添加一个条目。然而,当包括λ时,加载时间存在很大差异。只要有它就会影响加载时间,即使它没有被调用。这只发生在第一次创建类的实例时。
在第二个例子中,缓慢延迟直到实际调用该方法。
我正在努力寻找有关紧凑框架的CLR的具体细节,这将有助于解决这个问题。
答案 0 :(得分:1)
如果性能延迟是一致的(即在同一硬件上的同一点发生),那么我会将一次性能延迟归因于JIT编译。虽然不一定方便,但一次性延迟是JIT编译的典型特征。
由于您提到它仅在发布模式下发生,因此另一个考虑因素可能是编译器正在执行某些优化,例如内联,这会触发延迟行为。测试该理论的一种方法是创建一个禁用优化的发布版本,然后查看问题是否可重现。