私はアプリケーションを起動した直後にうまく機能するようにアプリケーションを最適化しようとしています。現時点では、その配布には、合計57メガバイトの304バイナリ(外部依存関係を含む)が含まれています。 WPFアプリケーションは、大部分の計算をすることなく、主にデータベースアクセスを行います。.NET JITコンパイルのパフォーマンス(動的メソッドを含む)は、C#コンパイラのイメージデバッグオプションの影響を受けますか?
私は、デバッグ設定が、アプリケーションのプロセスの存続期間中に初めて実行されるため、ほとんどの操作でより良い(〜5倍のゲイン)時間を提供することを発見しました。たとえば、アプリケーション内で特定の画面を開くには、NGENedデバッグの場合は0.3秒、JITデバッグの場合は0.5秒、NGENedリリースの場合は1.5秒、JITtedリリースの場合は2.5秒かかります。
JITコンパイル時のギャップは、JITコンパイラがリリースバイナリに対してより積極的な最適化を適用していることが原因であると私は理解します。私が知ることは、/p:DebugType
と/p:Optimize
スイッチがC#コンパイラに渡されることでデバッグとリリースの設定が異なりますが、でアプリケーションをビルドしても同じパフォーマンスの差が見られます。つまり、/p:Configuration=Debug
と同じイメージデバッグオプションです。
結果のアセンブリに適用されたDebuggableAttribute
を見てオプションが適用されたことを確認します。 NGEN出力を観察すると、コンパイルされているアセンブリの名前に<debug>
が追加されています。NGENはデバッグアセンブリと非デバッグアセンブリをどのように区別しますか?テスト対象のオペレーションは動的コード生成を使用します。動的コードにはどのレベルの最適化が適用されますか?
注:外部依存関係のため、32ビットフレームワークを使用しています。 x64で異なる結果が期待できるはずですか?
注:条件付きコンパイルも使用しません。コンパイルされたソースは両方の設定で同じです。
Release NGENedアセンブリのデバッグがまだ遅いため、JITが問題になっていますか?プロファイラを試すこともできます。また、#ifデバッグをコード内で使用していないことを確認してください。 – Guillaume
SGENなしでXmlSerializerを使用していますか? http://stackoverflow.com/questions/771727/net-release-build-working-slower-than-debug – Guillaume
私は '#if DEBUG'(これを反映するために編集された質問)を使用していません。リリースでは、アプリケーションの速度が必ずしも遅くなるわけではありません。速度は速いかもしれませんが、処理速度ではなく、低温起動時間を測定しています。私はダイナミックメソッドのJITtingを疑うので、それらの最適化レベルを決定するものを尋ねます。 – cynic