トップ回答者
VS2010で「コード最適化」の設定のオプションについて

質問
-
現在、VS2010のC#で開発を行っております。
xxx.sln の [プロパティ] →[ビルド] プロパティ →[コードの最適化] のチェック行なった場合に
指定される、最適化オプションは何になるのでしょうか。http://msdn.microsoft.com/ja-jp/library/k1ack8f1.aspxで見る限りは
以下のオプションがあると考えておりますが、何れが設定されるのかが分かりません。/O1 は、コード サイズを最小化します。
/O2 は、実行速度を最大化します。
/Ob は、関数のインライン展開を制御します。
/Od は、最適化を無効にして、コンパイルの高速化およびデバッグの簡素化を実現します。
/Og は、グローバル最適化を有効にします。
/Oi は、関数呼び出し用の組み込み関数を生成します。
/Os は、実行速度よりもサイズの最小化のための最適化処理を優先します。
/Ot は、サイズの最小化よりも実行速度のための最適化処理を優先します。これは既定の設定です。
/Ox は、最大限の最適化を選択します。
/Oy を指定すると、呼び出し履歴にフレーム ポインターが作成されないため、関数呼び出しが速くなります。よろしくお願い致します。
回答
-
> http://msdn.microsoft.com/ja-jp/library/k1ack8f1.aspx で見る限りは
> 以下のオプションがあると考えておりますが、何れが設定されるのかが分かりません。そのオプションは C++ のものですよ。 C# の最適化オプションは以下になります。
http://msdn.microsoft.com/ja-jp/library/t0hfscdc.aspx
ひらぽん http://d.hatena.ne.jp/hilapon/
すべての返信
-
> http://msdn.microsoft.com/ja-jp/library/k1ack8f1.aspx で見る限りは
> 以下のオプションがあると考えておりますが、何れが設定されるのかが分かりません。そのオプションは C++ のものですよ。 C# の最適化オプションは以下になります。
http://msdn.microsoft.com/ja-jp/library/t0hfscdc.aspx
ひらぽん http://d.hatena.ne.jp/hilapon/ -
-
外池です。言葉足らずで申し訳ありません。コンパイラーの作成者が対処すべき、と申し上げたのは、C#によるプログラミングに限って・・・、のことです。(以下も、その前提で。)
まぁ、もちろん、プログラムする側の不手際によって最適化で障害が出るかもしれませんが、C#の場合、最適化の詳細なルールが明らかにされていないし、じゃぁ、プログラムする側が何に注意すれば良いのかガイドラインが無いなぁ、と思う次第です。
割り切った整理をすると・・・、
C#の言語仕様や.Net Frameworkのライブラリの仕様に則った「正しい」(まぁ、エイヤっと、とにかく「正しい」)プログラムが、最適化で障害が出た・・・。これは、コンパイラーの作成者の責任ですよね。バグのあるプログラム・・・、これは、そもそも、最適化しようが、しまいが、変な動きをする。これは、プログラマの責任。
うん? バグがあっても最適化ナシだと顕在化せず、最適化すると顕在化する場合もあるのか・・・、な? これか・・・、問題なのは。
(ホームページを再開しました) -
> 実行時の最適化(JIT) があると思います。
ヘルプに書いてありますが、
> /optimize は、実行時にコードを最適化するように共通言語ランタイムに指示します。
です。
これは語弊がありませんか?>/optimize オプションは、コンパイラで行われる最適化の有効と無効を切り替えて、出力ファイルのサイズを小さくし、速度と効率を高めます。
:
>また、/optimize は、実行時にコードを最適化するように共通言語ランタイムに指示します。
という記述ですから、あくまで、実行時に「も」最適化するように指示される、という意味だと思います。
-
> 実行時に「も」最適化するように指示される、という意味だと思います。
/optimize と /debug によって生成される IL にも影響が出ます。その上で前回書いているように、/optimize では実行時の最適化も止まるようになっていますので、最適化によって発生した問題点を最適化の位置で切り分ける必要はないようになっています。(分析としてはありですし、知っていたほうがよいこともあります)
言い方をかえると、
「最適化を有効にしたことで発生する問題」が、IL レベルの最適化によって発生したのか、JIT コンパイル等の最適化で発生したのか、そんなことは「同一のソースコードから得られる結果が違う」という状況に影響を与えないように /optimize はその切り分けに対して必要な機能を提供してくれています。このため、コンシューマは IL レベルの最適化と実行時の最適化の違いを切り分けずに問題に対処することができるようになっています。
前にかいている
- コンパイラの不具合で、最適化によって間違ったコードが生成され、動作が変化する
- コーディングの不具合が、最適化によって表面化し、動作が変化する
という切り分けを行うに十分であるということです。IL レベルなのか実行時のレベルなのかといったことは、問題が前者であることが確定したときに Microsoft や興味のある人が考えることであって、コンシューマレベルでの問題解決にはなんら影響がないことだと思います。
-
「最適化を有効にしたことで発生する問題」が、IL レベルの最適化によって発生したのか、JIT コンパイル等の最適化で発生したのか、そんなことは「同一のソースコードから得られる結果が違う」という状況に影響を与えないように /optimize はその切り分けに対して必要な機能を提供してくれています。このため、コンシューマは IL レベルの最適化と実行時の最適化の違いを切り分けずに問題に対処することができるようになっています。。
なるほど、そういう点は意識できていませんでしたので、フォローとして助かりました。
ただ、あのシンプルな引用文ではその意味までは伝わってこないので、言葉を補っていただきたかったと思います。(私はおいておくとしても、ほかの多くの閲覧者に伝えるためにも)なお、私の最初の投稿ですが、最適化の細かいオプションを例に挙げられていたので、2 つの最適化があること、単純に C++ と比較するのは前提などが違うということは紹介してよいものと考えたものです。途中の投稿を読み直す限り、確かに問題解決の方向に仕向けた方がよかったかもしれませんね。
「ほとんどの開発者」は知らなくても何ともなることではあるとは思っています。
(このケースにおいて、「ほとんどの開発者」を「コンシューマ」と呼ぶことは少し抵抗がありましたので私の発言では置き換えています)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2011年10月26日 13:33