Visual Studio 2005では、リリース用にビルドするのに約2分かかりますが、デバッグ用にビルドするのに約6分かかる195 cppファイルのライブラリが1つあります。デバッグビルドがリリースよりもずっと遅くコンパイルされます
私はいつもリリースビルドは最適化のために時間がかかると考えました。なぜ、デバッグビルドはリリースよりもずっと時間がかかりますか?デバッグのスピードを速くしてリリースと同じくらい速くすることはできますか?
ブースト/ストールコードがかなりあります。
Visual Studio 2005では、リリース用にビルドするのに約2分かかりますが、デバッグ用にビルドするのに約6分かかる195 cppファイルのライブラリが1つあります。デバッグビルドがリリースよりもずっと遅くコンパイルされます
私はいつもリリースビルドは最適化のために時間がかかると考えました。なぜ、デバッグビルドはリリースよりもずっと時間がかかりますか?デバッグのスピードを速くしてリリースと同じくらい速くすることはできますか?
ブースト/ストールコードがかなりあります。
ここでは、スターボリンのコメントをと答え、リンゴとオレンジとします。チャーリーのI/O制限は、デバッグのために書かれた600MBとリリースのための300MBという私のプロセスモニターの計算では分かりませんでした。つまり、余分な300MBを書き込むには、4分ではなく、数秒かかるでしょう。したがって、デバッグビルドとリリースビルドの間にはちょっとした違いがあると私は結論づけています。最適化は最適化を行わない場合よりも時間がかかるはずですが、これらのデバッグ専用アクティビティはそれ以上の時間を必要とします。デバッグとリリースの時間が正確にどこにあるのか分かりませんが、Visual Studio 2005とプロジェクトのベンチマークではかなり異なるプロセスであり、デバッグにはかなり時間がかかります。
ベストビュー:デバッグビルドはI/O制限付きですが、リリースビルドはプロセッサ制限(この場合)です。
私たちはビルドシステムのベンチマークテストを大規模に行っています。 DEBUG
は、*.pdb
という情報をたくさん書き出します。さらに、より多くの*.obj
ファイル(追加のデバッグ情報用)などを作成します。その結果、大量のディスクアクティビティが発生します。これは、などとは対照的に
、RELEASE
はずっと小さい*.obj
ファイルを書き出し、およびdoesnのビルドを、さらにあなたは、ソースコード(テーブル、記号、文字列リテラル)の「リテラル」をたくさん持っている場合は強調されます「デバッグ」データベースを書くのは面倒です(普通のスイッチでRELEASE
をコンパイルした場合)。しかし、RELEASE
ビルダーのリンカーは、その最適化を行う必要があり、他の多くの作業はDEBUG
で行われていないので、プロセッサーにバインドされています。これは、最も困難なリンカースイッチを使用して「コンパイル時最大スピード/サイズ」にすると、さらにRELEASE
に時間がかかることがあります。
(ただし、RELEASE
ビルドでは、実行可能になる実行可能ファイルのI/Oアップデートアドレスが必要ですが、RELEASE
ビルドで実行可能ファイルが非常に小さいため、以下、RELEASE
ビルドでI/OペナルティがDEBUG
ビルドの限りではありませんので。)
あなたが3回観測している「RELEASE
がDEBUG
よりも高価です」。それは、たくさんのテンプレート、多くのシンボルやリテラルなどでI/Oに束縛されているプロジェクトにとっては正しいことです。あなたのドライブをチェックしてください。フルであるか、単に「スロードライブ」であるか、 ?それらは、DEBUG
ビルドのために悪化します(遅くなります)。
はい、他のビルドは「DEBUG
よりも3倍高価なもの」の「RELEASE
」と反対の方向にする必要があります。これらのビルドは、I/Oバインドではなく、プロセッサ/リンカーにバインドされています。
[UPDATE]、これは「静的ライブラリ、no-linking」のためのコメントです。これは、I/O(ディスク・アクティビティ、リンクなし)の時間ペナルティのための最悪の場合のシナリオであり、(最適化が行われていないために)プロセッサ・ペナルティはありません。したがって、3倍の "DEBUG
-is-slow-than-RELEASE
"があれば、おそらくそれは(このプロジェクトのために)得ることができるほど悪くて、それは非典型的ではありません。リンクオプションを追加すると、RELEASE
が遅くなります。
ファイルシステムキャッシュのレイジーライトバックのおかげで、ファイルを書き込むことはWindowsで非常に安価です。この回答は、マシンが厳しくRAMに制約されている場合にのみ意味があります。起こりうるが、ギガバイト相当のオブジェクト/デバッグデータを生成するのは簡単ではない。 –
@Hans、sort-of-agree。レイジーはヘルプを書いていますが、NTFSは他のファイルシステムと比較してほぼすべてのファイル操作に驚くほど高価であることがわかりました。ファイルがネットワークリソースを介してキャッシュ/転送される場合、レイジー書き込みはまったく役に立ちません(例えば、ファーム構築、分散構築システム)。 Win7は、Win7のセキュリティ向上のために、XP/Vistaよりもファイルハンドルのペナルティ/レイテンシーの不思議さを増やし、組み込みシステムのあらゆる種類のファイル/ポートハンドルの問題を引き起こしました。 – charley
[このブログの記事](http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you -build.aspx)は、debugとreleaseで書かれたバイトを測定する方法について説明しています。 devenv.exeとcl.exeを監視する必要があります。それは、リリース用に書かれた約300MBと、デバッグ用に書かれた600MBになった。 1GBのものをコピーしているシェルでテストしたところ、約10秒かかりました。したがって、300MBの余分な書き込みで実際に4分以上かかることはありません。ちょうどIOの他に長い時間を費やしている他のコンパイラ活動がなければならない。 – Philip
両方でプリコンパイル済みヘッダーを使用していますか? –
ビルドオプションとは何ですか? –
はい両方のPCH。/I/D PCH以外のビルドオプションは、/ Od/Gm/EHsc/RTC1/MDd/W4/nologo/c/Wp64/ZI/TP/errorReport:prompt/wd4018/Zm200です。うん、私はそこに「大きなオプションファイルを書く」ことを考えていたのだろうか。時間はライブラリを構築するだけで、リンクはできません。 – Philip