3

コンパクトなフレームワーク 3.5 アプリケーションで大きなフォームの 1 つを最適化しているときに、ラムダ式を含むフォームをロードするときにパフォーマンスが大幅に低下することに気付きました。これは、リリース モードでデバイス上でアプリケーションを実行している場合にのみ顕著です。

フォームに次のようなコードが含まれている場合:

foreach (MyObject in objects.OrderBy(x => x.id))

クラスの基本コンストラクターは、(ハードウェアによっては) 同等のコンストラクターよりも実行に数秒長くかかります。

foreach (MyObject in objects.OrderBy(FunctionPointerInsteadOfLambda)) 

...

private string FunctionPointerInsteadOfLambda(MyObject obJ) {
    return obj.Id;
}

私の理解では、ラムダは匿名メソッドにコンパイルされ、これによりクラスのメソッド スロット テーブルにエントリが追加されます。ただし、ラムダを含めると、ロード時間に大きな違いがあります。呼び出されなくても、そこにあるだけでロード時間に影響します。これは、クラスのインスタンスを初めて作成するときにのみ発生します。

2 番目の例では、メソッドが実際に呼び出されるまで遅延が延期されます。

この問題に光を当てるコンパクトフレームワークのCLRに関する特定の詳細を見つけるのに苦労しています。

4

1 に答える 1

1

パフォーマンスの遅延が一貫している (つまり、同じハードウェアの同じポイントで発生している) 場合、1 回限りのパフォーマンスの遅延は JIT コンパイルに起因すると考えられます。必ずしも便利ではありませんが、1 回の遅延は JIT コンパイルの典型です。

リリースモードでのみ発生すると述べているため、別の考慮事項として、コンパイラがインライン化などの最適化を実行しており、遅延動作をトリガーしている可能性があります。この理論をテストする 1 つの方法は、最適化を無効にしてリリース ビルドを作成し、問題が再現可能かどうかを確認することです。

于 2013-07-13T18:15:33.393 に答える