在Compact Framework 3.5中使用lambda表达式加载类在首次加载时很慢

时间:2013-07-12 20:57:26

标签: c# .net linq compact-framework clr

在紧凑框架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的具体细节,这将有助于解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果性能延迟是一致的(即在同一硬件上的同一点发生),那么我会将一次性能延迟归因于JIT编译。虽然不一定方便,但一次性延迟是JIT编译的典型特征。

由于您提到它仅在发布模式下发生,因此另一个考虑因素可能是编译器正在执行某些优化,例如内联,这会触发延迟行为。测试该理论的一种方法是创建一个禁用优化的发布版本,然后查看问题是否可重现。