1

重複の可能性:
C#64ビットリリースコードの逆アセンブリビューは、32ビットデバッグコードより75%長いですか?

私は非常に単純なC#コンソールアプリケーションを持っています。hatは多数の要素(配列操作を含む数行のコードのみ)でいくつかの並べ替えを行います。

Visual Studio IDEからF5またはCtrl-F5を使用してリリースコードを開始すると、Win-Explorerから直接開始した場合よりもプログラムが約3倍遅くなります。

41.140 seconds when launched from VS 2010 IDE
13.950 seconds when launched by double-clicking myprogram.exe

なぜ???

4

4 に答える 4

6

最初にいくつかの詳細...

.NETには2つの主要な「最適化」段階があることに注意してください。

  • C#コンパイラレベルで

    ...さまざまなIL(中間言語)の生成...最適化または非最適化....プロジェクトがDEBUGフラグを設定するかどうかによって制御されます

  • JITerレベルで

    ...ILがマシンコードに変換されるとき(ジャストインタイムコンパイルまたはNGENを介して)...最適化されたマシンコードが生成される場合とされない場合があります

    注:これは、を介して生成されたILではありません。 JITter最適化設定を制御するDEBUGまたはRELEASEモードのコンパイラ...これは独立した設定です。

主な最適化の「勝利」は、JITレベルで発生します。

Visual Studioを使用してNETプログラムをデバッグする場合、通常、JITterが最適化されたマシンコードを生成することは望ましくありません。これは、プログラムのソースステートメントが実行中のコードと密接に同期していないためです。

そのため、Visual StudioにはJITter最適化をオフにするオプションがあります(これは、AllowOptimize=0フラグを使用してJITter最適化をオフにすることに相当します)...デフォルトでは、VisualStudioはJITter最適化をオフにします。

ここに画像の説明を入力してください

Suppressオプションの説明については、次を参照してください。

Visual Studioの外部でNETアプリケーションを実行する場合、そのプログラムがDEBUG(最適化されていないIL)またはRELEASE(最適化されたIL)としてコンパイルされたかどうかは関係ありません。JITterはデフォルトで最適化されたマシンコードを生成します。

したがって、注意すべき動作は、JITter最適化設定が異なるため、VisualStudioの外部で開始した場合のNETプログラムの実行速度がVisualStudioの外部で開始した場合よりも大幅に速くなることです。 Knasterbaxが観察されました。さらに、Visual Studioからの実行(CTRL + F5)だけでなく、デバッグ(F5)時に追加する追加のオーバーヘッドがあります。

エクスプローラーからアプリケーション(RELEASEまたはDEBUG)を実行し、Visual Studioを使用してプロセスに「アタッチ」すると、アプリケーションは最適化を適用するJITterを使用します。コードはより高速に実行されます。ただし、ソースコードのステッピングは同期されません。

「JIT最適化の抑制」のチェックを外すと、Visual Studioでのデバッグエクスペリエンスが低下しますが、実行速度が向上します。


最後に、次のことが必要/必要な場合に、アプリケーションコードのJITter最適化をオフにする方法があります。

  • これをapp.configに入れて、アプリケーション全体のJITterを無効にします

[.NETFrameworkデバッグ制御]
AllowOptimize= 0

  • この属性を使用して、指定されたメソッドを最適化しないようにJITterに指示できます。

[MethodImpl(MethodImplOptions.NoOptimization)]

メソッド本体について。

于 2012-10-09T12:02:07.597 に答える
3

F5は「実行」ではなくデバッグを開始します。リリースビルドをデバッグしようとしている場合でも、バックグラウンドでシンボルをロードするなど、多くのことを実行します。

于 2012-10-09T11:45:49.433 に答える
2

デバッガーを接続した状態でプログラムを開始すると、それがない場合よりも常に大幅に遅くなります。

于 2012-10-09T11:45:40.253 に答える
0

デバッグモードでコードをコンパイルすると、コンパイラはいくつかの最適化をオフにし、いくつかの追加の命令を追加して、ブレークポイントをどこにでも配置できるようにし、コードをシングルステップで実行できるようにします。

これにより、デバッグモードでコンパイルされたコードは、リリースモードでコンパイルされたコードよりも遅くなります。

于 2012-10-09T11:55:45.333 に答える