2009-06-09 14 views
8

/optimize C# compiler keyで利用可能な最適化の完全なリストはありますか?/最適化C#コンパイラキーの目的は何ですか?

編集: デフォルトでは無効になっているのはなぜですか? 実世界のアプリで使用する価値はありますか? - デフォルトではデバッグ設定でのみ無効になっており、リリースでは有効になっています。

+2

私は6月11日に私のブログでこの質問によくお答えします。 –

+2

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

答えて

7

Scott Hanselman has a blog postこれはwhat/optimize(リリースビルドで有効)のいくつかの例を示しています。

要約:/ optimizeは正確な数や定義がない多くのことを行いますが、より目立つ方法の1つはメソッドのインライン展開です(C()を呼び出すメソッドA() D()を呼び出すと、コンパイラはBとCをスキップしてAからDに直接移動することがあります。これにより、リリースビルドで "奇妙な"呼び出しスタックが発生する可能性があります。

+0

ニース、ありがと:-) –

2

デフォルトでは、デバッグビルドでは無効になっています。リリースビルドでは有効になっています。

このスイッチを有効にする価値はありますが、コンパイラはコードの種類に応じて多くの調整と最適化を行います。 例:冗長な初期化をスキップする、変更しない比較など

注:生成したコードと生成されたILコードが一致しない可能性がある場合は、デバッグするのが難しい場合があります。これが、リリースビルドに対してのみオンになっている理由です。 MSDN pageから引用

+0

ああ、確かに。私は質問を更新します。しかし、私はまだ最適化の正確な(または十分な完全な)リストが何か不思議です... –

2

/optimizeオプションを有効または は、出力ファイル 、より小さくより速く、そしてより効率的に行うために コンパイラによって実行される最適化を無効にします。

つまり、.NET VMによって実行されるコンパイル済みのCIL(Common Intermediate Language)コードが最適化されます。具体的な最適化が何であるかについては心配しません。それらは数多くあり、おそらくかなり複雑な場合もあります。あなたが本当に何かのことに興味があるなら、おそらくMono C# Compilerを調べることができます(私はMS C#1の詳細が公開されているかどうか疑問です)。

デフォルトでのデバッグのコンフィギュレーションの理由は、特定のデバッグ機能を不可能にすることです。いくつかの注目すべきもの: - すなわち、実行中の無修正コード最も決定的おそらく

  • 編集や機能を続行は無効になっています。
  • 実行を中断すると、間違った行のコードが強調表示されることがよくあります(通常、予想される行の後ろのもの)。
  • 未使用のローカル変数は、実際には割り当てられておらず、宣言されていません。

実際、最適化のデフォルトオプションは決して変更する必要はありません。デバッグのオプションをオフにすることは非常に便利ですが、リリースモードでオンにすることも同様に賢明です。

+0

私は最適化について心配していません、私はちょうど彼らが何であるかを知りたいです:-) 私はあなたをupvoteしたい努力もしていますが、1つは私がそれをやめさせることです: ".NET VM" :-) –

+0

+ 1 vote。この用語は正確ではありませんが、CLRをVMと呼ぶことは概念的な観点からは全く間違っていません。存在しないがCLRでエミュレートされているマシン上で実行される疑似マシンコードCILがあります。巨大な(ほとんど有益な)結果をもたらすものであっても、CLRがコードをJITするということは、実装の詳細であるという主張が可能です。 –

+0

@Rui:ありがと...そして、ええ、私はそれが技術的にCLRだと思っていましたが、私は多くの議論のために同義語を使い分ける傾向があります。あなたの説明は事を明確にします。また、CLRのJavaに相当するものが明示的にVM(JVM)と呼ばれていることに気付くこともあります。私はMSでもVMとして参照することがありますので、この文脈ではかなり一般的です。 – Noldorin

関連する問題