3

在紧凑型框架 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 编译为匿名方法,这将在类的方法槽表中添加一个条目。但是,当包含 lambda 时,加载时间存在如此大的差异。简单地把它放在那里会影响加载时间,即使它没有被调用。这只发生在第一次创建类的实例时。

在第二个示例中,延迟会延迟到实际调用该方法。

我正在努力寻找有关紧凑框架的 CLR 的具体细节,这些细节可以阐明这个问题。

4

1 回答 1

1

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

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

于 2013-07-13T18:15:33.393 回答