これらのオプションは、実際には最適化に関するものではありません (dub がそれらを組み合わせるのは奇妙だと思います。dmd 自体では、これらは 8 つの独立したスイッチです....)、そして多くの人がそれらの意味について混乱しています。リスト、dmd スイッチ名を使用:
-debug
debug
コード内のステートメントでコンパイルするだけです。たとえば、 でコンパイルしたdebug writeln("foo");
場合にのみ foo を書き込み-debug
ます。それは他に何もしません!重要なのは、デバッガーの情報が含まれていないことです-g
(ただし、吹き替えはこれら 2 つのオプションを組み合わせる場合があります)。
-g
gdb
関数名を知りたいプログラムのために、シンボリックデバッグ情報を追加します。この同じ情報は例外スタック トレースの出力にも使用されるため、有効にするとスタック トレースに関数名も表示されます。
-release
assert
ステートメントin
、、、out
およびコントラクトを無効にし、関数invariant
の自動配列境界チェックを無効にし@system
ます (これはデフォルトです)。それだけです-最適化を有効にしたり、の反対を暗示したりするのではなく、関連するアイテム-debug
をスキップするだけです。assert
(これassert(0);
は特殊なケースであり、無効になることはありませんが、いずれにせよ発生してはならないことに注意してください。プログラムが強制終了されます。)
-unittest
ブロックをコンパイルし、unittest
実行直前に実行しますmain
(その後main
も通常どおり実行されます)。
-profile
関数の前後にタイミング情報を追加し、プログラムの完了時にその情報をログ ファイルに書き込みます。これはシングルスレッド プログラムでのみ機能し、ログを記録するとプログラム自体の速度が大幅に低下する可能性があることに注意してください。これを使用して、どの関数が最も多く呼び出され、最も遅く呼び出されているかを把握して、最適化の取り組みをどこに集中すべきかを知ることができます。
-cov
プログラムのどの行が実際に実行され、どの行が実行されなかったかを示す情報をテスト ログに追加します。
-profile=gc
GC 固有のプロファイリングを行い、タイミング情報を含むログを書き出します。
-D
コンパイル中にコード内の ddoc 情報から HTML ファイルを生成します。ダブはこれを呼び出しますdocs
。ddox
は似ていますが、デフォルトの 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 -O
ldc -O
ダブに戻る。パッケージ形式のドキュメントを確認してください: http://code.dlang.org/package-format?lang=json
ビルド タイプrelease
なので、dmddub build -b release
に渡されます。-O -release -inline
Typerelease-nobounds
は nobounds スイッチも追加します。これは、dmd ドキュメントで最速の実行可能ファイルと呼ばれるものであり、私はバグのある間違いと呼んでいます。
私が見ることができる最良の吹き替えオプション (私自身は実際には使用していません) は、吹き替え構成ファイル (dub.json または dub.sdl)に追加buildOptions
することです。optimize
これにより、プログラムの残りの部分のバグ対策機能を損なうことなく、ホットスポットを選択的に高速化するために、テクニックや高価な-O
ものを使用できます。.ptr
version
assert
ダブのドキュメントの詳細はこちらをご覧ください:
http://code.dlang.org/package-format?lang=json#build-options