2016-07-01 7 views
1

dubが最適化されたバイナリを下位に構築するためには、どのような昇順ですか? (例えば...デバッグ<平野<リリース...)Dの最適化レベルは何ですか?

$ dub build -h 
... 
     -b --build=VALUE  Specifies the type of build to perform. Note that 
          setting the DFLAGS environment variable will override 
          the build type with custom flags. 
          Possible names: 
           debug (default), plain, release, release-debug, 
           release-nobounds, unittest, profile, profile-gc, 
           docs, ddox, cov, unittest-cov and custom types 
... 

dub build -b release-noboundsdmd -O -release -boundscheck=off由来と思われるので、fastest executablesを構築するdubの等価は何ですか?

答えて

8

これらのオプションは実際は最適化に関するものではありません(dub自体では、8つの独立したスイッチです...)、多くの人が何を意味するのか混同していますので、DMDスイッチ名を使用して、私のリストを聞かせて:

  • -debugは単にコード、例えばにdebug文でコンパイルdebug writeln("foo");は、-debugでコンパイルされた場合にのみfooを書き込みます。それ以外は何もしません!重要なのは、-gで行われるデバッガの情報は含まれていない(ただし、ダブはこれらの2つのオプションを組み合わせている可能性があります)。

  • -gは、gdbなどのプログラムでシンボリックデバッグ情報を追加して関数名を認識します。この同じ情報は例外スタックトレース印刷にも使用されるため、スタックトレースにも関数名が表示されます。

  • -releaseassert文、inout、及びinvariant契約を無効にし、自動配列@system機能(BTWデフォルトである)でチェックを境界。つまり、最適化を有効にしたり、-debugの逆を意味したりせず、それらの項目をスキップします。assert関連項目(assert(0);は特殊なケースであると無効になることはありませんが、それはとにかく決して起こらない必要があることに注意してください - 。それはプログラムを殺す)

  • -unittestunittestブロックをコンパイルし、右main(当時mainはまだ意志を実行する前に、それらを実行します後で、通常のように実行する)。

  • -profileは、機能の前後にタイミング情報を追加し、プログラムが完了するとその情報をログファイルに書き込みます。シングルスレッドのプログラムでのみ動作し、プログラムのロギングによってプログラム自体が大幅に遅くなることに注意してください。どの関数が最も呼び出されているかを知るために、そして最適化作業のどこに焦点を当てるのが最も遅いかを理解するために使用します。

  • -cov実際に実行されたプログラムの行と実行されなかった行を示す情報をテストログに追加します。

  • -profile=gcは、GC固有のプロファイリングを行い、タイミング情報とともにログを書き出します。

  • -Dは、コンパイル時にコードのddoc情報からHTMLファイルを生成します。ダブはdocsと呼ばれます。 ddoxは似ていますが、デフォルトのdmd htmlジェネレータの代わりにダブカスタム文書ジェネレータを使用しています。 http://dlang.org/phobos/std_algorithm.htmlこれはddoxのです:これはDDOCの出力である配列の境界チェックがコンパイルされた場合http://dlang.org/library/std/algorithm.html

  • -boundscheck=xxxxが決定 - どこにも安全機能、すべての機能、またはを。(古いバージョンでは、これは-releaseスイッチに結びついていましたが、別々に行うことができます)。 -releaseのデフォルトは@safeです。他の場所では、デフォルトはすべての機能です。

それらのどれもが-Oまたは-inlineなかったことに注意してください! -Oはコードを最適化することを意味し、-inlineはインライン関数を意味します(インラインでデバッガが混乱することがあるため、別々に実行します)。他のコンパイラgdcとldcは-Oオプションで自動的にインライン展開します。 。とにかく、DMDよりも、それの良い仕事)

は個人的に、私は-boundscheck-releaseを使用してに強くお勧めします - それらはただ、最終的な速度に差が大きいことをせずに、ほとんどの場合、バグを非表示にします。いくつかのタイトループで境界チェックが遅い場合は、プログラム全体で-boundscheckを使用せずに、代わりに.ptrを使用してください(どの機能を最適化するかは、-profileを使用してください)。 http://arsdnet.net/this-week-in-d/dec-06.html

-releaseあなたが高価なアサーションのトンをしている場合にのみ、大きな違いがあります。また、すべてを無効にする代わりに高価なものを個別にバージョンアップすることをお勧めします。合法的に一般的なバグを発見する本当に迅速なチェックを含む。

したがって、最適化されたdmdビルドについては、-O、おそらく-inlineとすることをおすすめします。多くの(ただしすべてではない)プログラムbtwの場合、gdc -Oldc -Oはdmdスイッチの組み合わせよりも優れています.CPUに制限がある場合は、それらを試してみるとよいでしょう。


ダブに戻る。パッケージ形式のドキュメントをチェックアウト:http://code.dlang.org/package-format?lang=json

ビルドタイプreleaseを、そうdub build -b release DMDする-O -release -inlineを渡します。タイプrelease-noboundsはnoboundsスイッチも追加します。これはdmdのドキュメントが最も高速な実行ファイルと呼ぶもので、私がバグのあるミスと呼ぶものです。

私は(私は実際にそれを自分自身を使用していない)見ることができるものから最高のダブオプションが与えダブ設定ファイル(dub.jsonまたはdub.sdl)

optimizebuildOptionsを追加することです-Oの場合は、テクニック、またはversionの高価なassertのものを使用して、残りのプログラムのバグ修正機能を犠牲にすることなくホットスポットを選択的にスピードアップできます。

ここで読むよりダブドキュメント:

http://code.dlang.org/package-format?lang=json#build-options

+0

はD'sのコンパイルと最適化の戦略上の徹底的な分析のために多くのことを感謝します。 – sof

関連する問題