最初にいくつかの詳細...
.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)]
メソッド本体について。