none
VS2010で「コード最適化」の設定のオプションについて RRS feed

  • 質問

  • 現在、VS2010のC#で開発を行っております。

    xxx.sln の [プロパティ] →[ビルド] プロパティ →[コードの最適化] のチェック行なった場合に
    指定される、最適化オプションは何になるのでしょうか。

    http://msdn.microsoft.com/ja-jp/library/k1ack8f1.aspxで見る限りは
    以下のオプションがあると考えておりますが、何れが設定されるのかが分かりません。

    /O1 は、コード サイズを最小化します。
    /O2 は、実行速度を最大化します。
    /Ob は、関数のインライン展開を制御します。
    /Od は、最適化を無効にして、コンパイルの高速化およびデバッグの簡素化を実現します。
    /Og は、グローバル最適化を有効にします。
    /Oi は、関数呼び出し用の組み込み関数を生成します。
    /Os は、実行速度よりもサイズの最小化のための最適化処理を優先します。
    /Ot は、サイズの最小化よりも実行速度のための最適化処理を優先します。これは既定の設定です。
    /Ox は、最大限の最適化を選択します。
    /Oy を指定すると、呼び出し履歴にフレーム ポインターが作成されないため、関数呼び出しが速くなります。

    よろしくお願い致します。

    2011年10月25日 2:53

回答

すべての返信

  • > 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/
    • 回答の候補に設定 山本春海 2011年11月4日 5:44
    • 回答としてマーク 山本春海 2011年11月11日 7:29
    2011年10月25日 3:21
    モデレータ
  • 外池と申します。

    お示しになっているURLと最適化オプションの一覧は、C++のものであって、C#のものではありません。C#のオプションについては、

    http://msdn.microsoft.com/ja-jp/library/2fdbz5xd(v=VS.100).aspx

    をご覧になるのがよいかと。

    結局のところ、「最適化する、しない」の2つの選択肢しかないです。


    (ホームページを再開しました)
    • 回答の候補に設定 山本春海 2011年11月4日 5:44
    • 回答としてマーク 山本春海 2011年11月11日 7:29
    2011年10月25日 3:24
  • ひらぽん様

    コメントをいただきありがとうございます。

    お教えいただいたアドレスを参照してみます。

    2011年10月25日 5:44
  • 外池様

    コメントを頂きありがとうございます。

    お教え頂いたアドレスを参照しこまかな最適化はできないと理解できました。

    C#で最適化により動作に影響が出る場合は、コンパイラメーカからすれば

    実装方法がよくないということですね。

    ありがとうございました。

    2011年10月25日 5:50
  • 外池です。

    「こまかな最適化はできない」というよりも、「最適化の方針を細かく選ぶことはできない」という方が正しいかと思います。

    >C#で最適化により動作に影響が出る場合は、
    >コンパイラメーカからすれば実装方法がよく
    >ないということですね。

    この下りについては、仰りたいことがよくわからないのですが・・・。

    私は、最適化によって動作に影響が出る場合、最適化の仕組みやルールを明示して使い方の注意を促していない限り、やはり、コンパイラーの作成者が対処すべき(第一義的に責任がある)ことと思います。


    (ホームページを再開しました)
    2011年10月25日 7:45
  • > 最適化によって動作に影響が出る場合、

    どっちもどっちでしょう。

    • コンパイラの不具合で、最適化によって間違ったコードが生成され、動作が変化する
    • コーディングの不具合が、最適化によって表面化し、動作が変化する

    C# ではだいぶ減りましたけど、どちらもありえる問題です。

    通常は、最適化を行ったことで動作がおかしくなった場合は後者を疑います。プログラミングミスに起因して最適化で問題が発生することは0ではありません。volatile つけわすれてたとか。

     

    2011年10月25日 8:47
  • 外池です。言葉足らずで申し訳ありません。コンパイラーの作成者が対処すべき、と申し上げたのは、C#によるプログラミングに限って・・・、のことです。(以下も、その前提で。)

    まぁ、もちろん、プログラムする側の不手際によって最適化で障害が出るかもしれませんが、C#の場合、最適化の詳細なルールが明らかにされていないし、じゃぁ、プログラムする側が何に注意すれば良いのかガイドラインが無いなぁ、と思う次第です。

    割り切った整理をすると・・・、

    C#の言語仕様や.Net Frameworkのライブラリの仕様に則った「正しい」(まぁ、エイヤっと、とにかく「正しい」)プログラムが、最適化で障害が出た・・・。これは、コンパイラーの作成者の責任ですよね。

    バグのあるプログラム・・・、これは、そもそも、最適化しようが、しまいが、変な動きをする。これは、プログラマの責任。

    うん? バグがあっても最適化ナシだと顕在化せず、最適化すると顕在化する場合もあるのか・・・、な? これか・・・、問題なのは。


    (ホームページを再開しました)
    2011年10月25日 9:12
  • 個人的には何でこの質問にいたったのかなぁと言う点を気にしています。

    .NET の世界では、コンパイル時の最適化(IL レベル)と、実行時の最適化(JIT) があると思います。
    なので、C++ のコンパイラーと比較するといろいろと違ってきます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年10月25日 13:35
    モデレータ
  • > 実行時の最適化(JIT) があると思います。

    ヘルプに書いてありますが、

    > /optimize は、実行時にコードを最適化するように共通言語ランタイムに指示します。

    です。

    2011年10月26日 0:21
  • > 実行時の最適化(JIT) があると思います。

    ヘルプに書いてありますが、

    > /optimize は、実行時にコードを最適化するように共通言語ランタイムに指示します。

    です。


    これは語弊がありませんか?

    >/optimize オプションは、コンパイラで行われる最適化の有効と無効を切り替えて、出力ファイルのサイズを小さくし、速度と効率を高めます。

    また、/optimize は、実行時にコードを最適化するように共通言語ランタイムに指示します。

    という記述ですから、あくまで、実行時に「も」最適化するように指示される、という意味だと思います。

    2011年10月26日 0:38
  • なちゃさんも指摘されていますし、Azuleanさんも分かっていて書かれていますが、ILレベルでの最適化として、nop除去とかあります。ほんのちょっとだけ最適化されます。
    # 共通式とかもうちょっとILレベルでやってくれてもいいのに、とか思ってます。

    2011年10月26日 1:05
  • > 実行時に「も」最適化するように指示される、という意味だと思います。

    /optimize と /debug によって生成される IL にも影響が出ます。その上で前回書いているように、/optimize では実行時の最適化も止まるようになっていますので、最適化によって発生した問題点を最適化の位置で切り分ける必要はないようになっています。(分析としてはありですし、知っていたほうがよいこともあります)

    言い方をかえると、

    「最適化を有効にしたことで発生する問題」が、IL レベルの最適化によって発生したのか、JIT コンパイル等の最適化で発生したのか、そんなことは「同一のソースコードから得られる結果が違う」という状況に影響を与えないように /optimize はその切り分けに対して必要な機能を提供してくれています。このため、コンシューマは IL レベルの最適化と実行時の最適化の違いを切り分けずに問題に対処することができるようになっています。

    前にかいている

    • コンパイラの不具合で、最適化によって間違ったコードが生成され、動作が変化する
    • コーディングの不具合が、最適化によって表面化し、動作が変化する

    という切り分けを行うに十分であるということです。IL レベルなのか実行時のレベルなのかといったことは、問題が前者であることが確定したときに Microsoft や興味のある人が考えることであって、コンシューマレベルでの問題解決にはなんら影響がないことだと思います。

     

    2011年10月26日 3:55
  • 「最適化を有効にしたことで発生する問題」が、IL レベルの最適化によって発生したのか、JIT コンパイル等の最適化で発生したのか、そんなことは「同一のソースコードから得られる結果が違う」という状況に影響を与えないように /optimize はその切り分けに対して必要な機能を提供してくれています。このため、コンシューマは IL レベルの最適化と実行時の最適化の違いを切り分けずに問題に対処することができるようになっています。。

    なるほど、そういう点は意識できていませんでしたので、フォローとして助かりました。
    ただ、あのシンプルな引用文ではその意味までは伝わってこないので、言葉を補っていただきたかったと思います。(私はおいておくとしても、ほかの多くの閲覧者に伝えるためにも)

    なお、私の最初の投稿ですが、最適化の細かいオプションを例に挙げられていたので、2 つの最適化があること、単純に C++ と比較するのは前提などが違うということは紹介してよいものと考えたものです。途中の投稿を読み直す限り、確かに問題解決の方向に仕向けた方がよかったかもしれませんね。

    「ほとんどの開発者」は知らなくても何ともなることではあるとは思っています。
    (このケースにおいて、「ほとんどの開発者」を「コンシューマ」と呼ぶことは少し抵抗がありましたので私の発言では置き換えています)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年10月26日 13:30
    モデレータ