Visual Studio 2005では、195 cppファイルを含む単一のライブラリがあります。リリース用にビルドするには約2分かかりますが、デバッグ用にビルドするには約6分かかります。
最適化のため、リリースビルドにはもっと時間がかかるはずだといつも思っていました。デバッグビルドがリリースよりもはるかに長くかかるのはなぜですか?とにかく、リリースと同じくらい速くデバッグビルドを高速化する方法はありますか?
かなりの量のboost/stlコードがあります。
Visual Studio 2005では、195 cppファイルを含む単一のライブラリがあります。リリース用にビルドするには約2分かかりますが、デバッグ用にビルドするには約6分かかります。
最適化のため、リリースビルドにはもっと時間がかかるはずだといつも思っていました。デバッグビルドがリリースよりもはるかに長くかかるのはなぜですか?とにかく、リリースと同じくらい速くデバッグビルドを高速化する方法はありますか?
かなりの量のboost/stlコードがあります。
最良の推測:デバッグビルドはI / O制限されていますが、リリースビルドはプロセッサ制限されています(この場合)。
ビルドシステムで広範なベンチマークを実施しました。大規模なプロジェクトが多数あり、小規模なプロジェクトもあります。DEBUG
ビルドは、多くの情報、はるかに大きなファイル(追加のデバッグ情報用)などを書き込みます。*.pdb
その*.obj
結果、ディスクアクティビティが大幅に増加します。ソースコードに「リテラル」(テーブル、記号、文字列リテラル)などがたくさんある場合、これはさらに強調されます。
対照的に、RELEASE
ビルドははるかに小さな*.obj
ファイルを書き込み、「デバッグ」データベースをわざわざ書き込むことはありません(RELEASE
通常のスイッチでコンパイルする場合)。ただし、RELEASE
ビルド内のリンカは、最適化やその他の大幅な処理を行う必要があります。で行われない作業が増えるDEBUG
ため、プロセッサに依存します。RELEASE
これは、最も困難なリンカースイッチを使用して「コンパイルして最大化する速度/サイズ」にする場合にさらに時間のペナルティが課せられます。
(ただし、はい、RELEASE
ビルドはディスク上にビルドされている実行可能ファイルのアドレスをI / O更新する必要がありますが、ビルドでは実行可能ファイルが非常に小さいRELEASE
ため、ページ数がはるかに少なくなり、I /ビルドでのOペナルティはRELEASE
ビルドほどではありませんDEBUG
。)
あなたは3倍の"RELEASE
が"よりも高価であることを観察していますDEBUG
。これは、多くのテンプレート、多くの記号やリテラルなどでI / Oバウンドになっているプロジェクトに適しています。ドライブがいっぱいになっているのか、単に「低速ドライブ」なのか、不良セクタがあるのかを確認してください。 ?DEBUG
それらはビルドを悪化させます(遅くします) 。
はい、他のビルドは逆で、「RELEASE
3倍の費用がかかるDEBUG
」必要があります。これらのビルドは、I / Oバウンドではなく、プロセッサ/リンカーバウンドです。
[更新]、質問へのコメントで、これは「静的ライブラリ、リンクなし」用であることがわかります。これは、I / Oの時間ペナルティ(大量のディスクアクティビティ、リンクなし)、およびプロセッサペナルティなし(最適化が行われていないため)のかなり最悪のシナリオです。したがって、3倍の「DEBUG
-is-slow-than- RELEASE
」がある場合、それはおそらく(このプロジェクトの場合)取得できるのと同じくらい悪いことであり、それは異例ではありません。リンクオプションを追加すると、RELEASE
が遅くなります。
答えとして、スターボリンのコメントをここに置きます:リンゴとオレンジ。チャーリーのI/O制限の推測は、デバッグ用に600MB、リリース用に300MBと書かれたプロセスモニターの計算ではうまくいかなかったようです。つまり、追加の300MBを書き込むには、4分ではなく、数秒かかります。したがって、デバッグビルドとリリースビルドの間で異なることがたくさんある可能性が高いと結論付けます。最適化には最適化なしよりも時間がかかるはずですが、これらの他のデバッグのみのアクティビティにはそれよりも時間がかかる必要があります。デバッグとリリースの時間が正確にどこにあるかを確認できればいいのですが、それらはまったく異なるプロセスであり、少なくともVisual Studio 2005と私がベンチマークしたプロジェクトでは、デバッグにかなり時間がかかることは明らかです。