起動直後にアプリケーションが適切に動作するように、アプリケーションを最適化しようとしています。現在、そのディストリビューションには 304 個のバイナリ (外部依存関係を含む) が含まれており、合計で 57 メガバイトになります。これは、重要な計算を行わずに、主にデータベース アクセスを行う WPF アプリケーションです。
ほとんどの操作は、アプリケーションのプロセスの存続期間中に初めて実行されるため、Debug 構成の方がはるかに優れた (最大 5 倍のゲイン) 時間を提供することがわかりました。たとえば、アプリ内で特定の画面を開くには、NGENed Debug で 0.3 秒、JITted Debug で 0.5 秒、NGENed Release で 1.5 秒、JITted Release で 2.5 秒かかります。
JIT コンパイル時間のギャップは、リリース バイナリに対してより積極的な最適化を適用する JIT コンパイラによって引き起こされることを理解しています。私が知る限り、デバッグ構成とリリース構成は、C# コンパイラに渡される/p:DebugType
およびスイッチによって異なりますが、アプリケーションをビルドした場合でも、同じパフォーマンス ギャップが見られます。つまり、 と同じイメージ デバッグ オプションです。/p:Optimize
/p:Configuration=Release /p:DebugType=full /p:Optimize=false
/p:Configuration=Debug
DebuggableAttribute
結果のアセンブリに適用された を見て、オプションが適用されたことを確認します。NGEN の出力を観察すると、<debug>
コンパイルされているいくつかのアセンブリの名前に追加されていることがわかります。NGEN はデバッグ アセンブリと非デバッグ アセンブリをどのように区別しますか? テスト対象の操作は動的コード生成を使用しています。動的コードにはどのレベルの最適化が適用されていますか?
注: 外部依存関係のため、32 ビット フレームワークを使用しています。x64 では異なる結果が期待できますか?
注: 条件付きコンパイルも使用しません。したがって、コンパイルされたソースは両方の構成で同じです。