3

dub以下の最適化されたバイナリをビルドするための昇順は何ですか? (例 ... デバッグ < プレーン < リリース ...)

$ 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-noboundsから派生したように見えるので、最速の実行可能ファイルをビルドするdmd -O -release -boundscheck=offのに相当するものは何ですか?dub

4

1 に答える 1

14

これらのオプションは、実際には最適化に関するものではありません (dub がそれらを組み合わせるのは奇妙だと思います。dmd 自体では、これらは 8 つの独立したスイッチです....)、そして多くの人がそれらの意味について混乱しています。リスト、dmd スイッチ名を使用:

  • -debugdebugコード内のステートメントでコンパイルするだけです。たとえば、 でコンパイルしたdebug writeln("foo");場合にのみ foo を書き込み-debugます。それは他に何もしません!重要なのは、デバッガーの情報が含まれていないことです-g(ただし、吹き替えはこれら 2 つのオプションを組み合わせる場合があります)。

  • -ggdb関数名を知りたいプログラムのために、シンボリックデバッグ情報を追加します。この同じ情報は例外スタック トレースの出力にも使用されるため、有効にするとスタック トレースに関数名も表示されます。

  • -releaseassertステートメントin、、、outおよびコントラクトを無効にし、関数invariantの自動配列境界チェックを無効にし@systemます (これはデフォルトです)。それだけです-最適化を有効にしたり、の反対を暗示したりするのではなく、関連するアイテム-debugをスキップするだけです。assert(これassert(0);は特殊なケースであり、無効になることはありませんが、いずれにせよ発生してはならないことに注意してください。プログラムが強制終了されます。)

  • -unittestブロックをコンパイルし、unittest実行直前に実行しますmain(その後mainも通常どおり実行されます)。

  • -profile関数の前後にタイミング情報を追加し、プログラムの完了時にその情報をログ ファイルに書き込みます。これはシングルスレッド プログラムでのみ機能し、ログを記録するとプログラム自体の速度が大幅に低下する可能性があることに注意してください。これを使用して、どの関数が最も多く呼び出され、最も遅く呼び出されているかを把握して、最適化の取り組みをどこに集中すべきかを知ることができます。

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

  • -profile=gcGC 固有のプロファイリングを行い、タイミング情報を含むログを書き出します。

  • -Dコンパイル中にコード内の ddoc 情報から HTML ファイルを生成します。ダブはこれを呼び出しますdocsddoxは似ていますが、デフォルトの dmd html ジェネレーターの代わりに dub-custom doc ジェネレーターを使用します。これは ddoc の出力です: http://dlang.org/phobos/std_algorithm.htmlおよびこれは ddox の出力です: http://dlang.org/library/std/algorithm.html

  • -boundscheck=xxxx配列境界チェックがコンパイルされる場所 (安全な関数、すべての関数、またはどこにもない) を決定します。(古いバージョンでは、これは-releaseスイッチに関連付けられていましたが、個別に実行できるようになりました)。のデフォルト-release@safe関数です。それ以外の場合、デフォルトはすべての関数です。

-Oそれらのどれもがまたはではないことに注意してください-inline!これらは dmd 最適化スイッチです:-Oコードを最適化する-inline手段と関数をインライン化する手段です (インライン化するとデバッガーが混乱することがあるため、これらは別々に行われます。他のコンパイラー gdc と ldc は、-Oオプションを使用して自動的にインライン化し、通常はより適切なジョブを実行します。とにかくdmdよりも。)

個人的には、 and を使用しないことを強くお勧めします - これらはほとんどの場合バグを隠すだけで、最終的な速度に大きな違いはありません。一部のタイトなループでの境界チェックが速度を低下させていることがわかった場合は、 を使用してプログラム全体でそれを強制終了するのではなく、代わりに低速の特定のアクセスに対して使用します (どの関数を最適化するかを判断するために を使用できます)。今週のヒント: http://arsdnet.net/this-week-in-d/dec-06.html-boundscheck-release-boundscheck.ptr-profile

-release大量の高価なアサーションを実行している場合にのみ大きな違いが生じます...そして繰り返しになりますが、合法的に一般的なバグをキャッチする非常に迅速なチェックを含め、すべてを無効にするのではなく、高価なものを個別にバージョンアウトすることをお勧めします。

したがって、最適化された dmd ビルドを使用すること-Oをお勧めします。ところで、多くの (すべてで-inlineはない) プログラムで、どの dmd スイッチの組み合わせよりも優れた仕事をします - CPU が限られている場合は、それらも試してみることをお勧めします。gdc -Oldc -O


ダブに戻る。パッケージ形式のドキュメントを確認してください: http://code.dlang.org/package-format?lang=json

ビルド タイプreleaseなので、dmddub build -b releaseに渡されます。-O -release -inlineTyperelease-noboundsは nobounds スイッチも追加します。これは、dmd ドキュメントで最速の実行可能ファイルと呼ばれるものであり、私はバグのある間違いと呼んでいます。

私が見ることができる最良の吹き替えオプション (私自身は実際には使用していません) は、吹き替え構成ファイル (dub.json または dub.sdl)に追加buildOptionsすることです。optimize

これにより、プログラムの残りの部分のバグ対策機能を損なうことなく、ホットスポットを選択的に高速化するために、テクニックや高価な-Oものを使用できます。.ptrversionassert

ダブのドキュメントの詳細はこちらをご覧ください:

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

于 2016-07-01T16:09:27.123 に答える