2012-05-18 9 views
5

Visual Studio 2005では、リリース用にビルドするのに約2分かかりますが、デバッグ用にビルドするのに約6分かかる195 cppファイルのライブラリが1つあります。デバッグビルドがリリースよりもずっと遅くコンパイルされます

私はいつもリリースビルドは最適化のために時間がかかると考えました。なぜ、デバッグビルドはリリースよりもずっと時間がかかりますか?デバッグのスピードを速くしてリリースと同じくらい速くすることはできますか?

ブースト/ストールコードがかなりあります。

+1

両方でプリコンパイル済みヘッダーを使用していますか? –

+0

ビルドオプションとは何ですか? –

+1

はい両方のPCH。/I/D PCH以外のビルドオプションは、/ Od/Gm/EHsc/RTC1/MDd/W4/nologo/c/Wp64/ZI/TP/errorReport:prompt/wd4018/Zm200です。うん、私はそこに「大きなオプションファイルを書く」ことを考えていたのだろうか。時間はライブラリを構築するだけで、リンクはできません。 – Philip

答えて

0

ここでは、スターボリンのコメントをと答え、リンゴとオレンジとします。チャーリーのI/O制限は、デバッグのために書かれた600MBとリリースのための300MBという私のプロセスモニターの計算では分かりませんでした。つまり、余分な300MBを書き込むには、4分ではなく、数秒かかるでしょう。したがって、デバッグビルドとリリースビルドの間にはちょっとした違いがあると私は結論づけています。最適化は最適化を行わない場合よりも時間がかかるはずですが、これらのデバッグ専用アクティビティはそれ以上の時間を必要とします。デバッグとリリースの時間が正確にどこにあるのか分かりませんが、Visual Studio 2005とプロジェクトのベンチマークではかなり異なるプロセスであり、デバッグにはかなり時間がかかります。

7

ベストビュー:デバッグビルドはI/O制限付きですが、リリースビルドはプロセッサ制限(この場合)です。

私たちはビルドシステムのベンチマークテストを大規模に行っています。 DEBUGは、*.pdbという情報をたくさん書き出します。さらに、より多くの*.objファイル(追加のデバッグ情報用)などを作成します。その結果、大量のディスクアクティビティが発生します。これは、などとは対照的に

RELEASEずっと小さい*.objファイルを書き出し、およびdoesnのビルドを、さらにあなたは、ソースコード(テーブル、記号、文字列リテラル)の「リテラル」をたくさん持っている場合は強調されます「デバッグ」データベースを書くのは面倒です(普通のスイッチでRELEASEをコンパイルした場合)。しかし、RELEASEビルダーのリンカーは、その最適化を行う必要があり、他の多くの作業はDEBUGで行われていないので、プロセッサーにバインドされています。これは、最も困難なリンカースイッチを使用して「コンパイル時最大スピード/サイズ」にすると、さらにRELEASEに時間がかかることがあります。

(ただし、RELEASEビルドでは、実行可能になる実行可能ファイルのI/Oアップデートアドレスが必要ですが、RELEASEビルドで実行可能ファイルが非常に小さいため、以下、RELEASEビルドでI/OペナルティがDEBUGビルドの限りではありませんので。)

あなたが3回観測している「RELEASEDEBUGよりも高価です」。それは、たくさんのテンプレート、多くのシンボルやリテラルなどでI/Oに束縛されているプロジェクトにとっては正しいことです。あなたのドライブをチェックしてください。フルであるか、単に「スロードライブ」であるか、 ?それらは、DEBUGビルドのために悪化します(遅くなります)。

はい、他のビルドは「DEBUGよりも3倍高価なもの」の「RELEASE」と反対の方向にする必要があります。これらのビルドは、I/Oバインドではなく、プロセッサ/リンカーにバインドされています。

[UPDATE]、これは「静的ライブラリ、no-linking」のためのコメントです。これは、I/O(ディスク・アクティビティ、リンクなし)の時間ペナルティのための最悪の場合のシナリオであり、(最適化が行われていないために)プロセッサ・ペナルティはありません。したがって、3倍の "DEBUG -is-slow-than-RELEASE"があれば、おそらくそれは(このプロジェクトのために)得ることができるほど悪くて、それは非典型的ではありません。リンクオプションを追加すると、RELEASEが遅くなります。

+2

ファイルシステムキャッシュのレイジーライトバックのおかげで、ファイルを書き込むことはWindowsで非常に安価です。この回答は、マシンが厳しくRAMに制約されている場合にのみ意味があります。起こりうるが、ギガバイト相当のオブジェクト/デバッグデータを生成するのは簡単ではない。 –

+0

@Hans、sort-of-agree。レイジーはヘルプを書いていますが、NTFSは他のファイルシステムと比較してほぼすべてのファイル操作に驚くほど高価であることがわかりました。ファイルがネットワークリソースを介してキャッシュ/転送される場合、レイジー書き込みはまったく役に立ちません(例えば、ファーム構築、分散構築システム)。 Win7は、Win7のセキュリティ向上のために、XP/Vistaよりもファイルハンドルのペナルティ/レイテンシーの不思議さを増やし、組み込みシステムのあらゆる種類のファイル/ポートハンドルの問題を引き起こしました。 – charley

+1

[このブログの記事](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

関連する問題