コンパクトなフレームワーク 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に関する特定の詳細を見つけるのに苦労しています。