5

Visual Studio 2005では、195 cppファイルを含む単一のライブラリがあります。リリース用にビルドするには約2分かかりますが、デバッグ用にビルドするには約6分かかります。

最適化のため、リリースビルドにはもっと時間がかかるはずだといつも思っていました。デバッグビルドがリリースよりもはるかに長くかかるのはなぜですか?とにかく、リリースと同じくらい速くデバッグビルドを高速化する方法はありますか?

かなりの量のboost/stlコードがあります。

4

2 に答える 2

8

最良の推測:デバッグビルドは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それらはビルドを悪化させます(遅くします) 。

はい、他のビルドは逆で、「RELEASE3倍の費用がかかるDEBUG」必要があります。これらのビルドは、I / Oバウンドではなく、プロセッサ/リンカーバウンドです。

[更新]、質問へのコメントで、これは「静的ライブラリ、リンクなし」用であることがわかります。これは、I / Oの時間ペナルティ(大量のディスクアクティビティ、リンクなし)、およびプロセッサペナルティなし(最適化が行われていないため)のかなり最悪のシナリオです。したがって、3倍の「DEBUG-is-slow-than- RELEASE」がある場合、それはおそらく(このプロジェクトの場合)取得できるのと同じくらい悪いことであり、それは異例ではありません。リンクオプションを追加すると、RELEASEが遅くなります。

于 2012-05-19T11:19:15.367 に答える
1

答えとして、スターボリンのコメントをここに置きます:リンゴとオレンジ。チャーリーのI/O制限の推測は、デバッグ用に600MB、リリース用に300MBと書かれたプロセスモニターの計算ではうまくいかなかったようです。つまり、追加の300MBを書き込むには、4分ではなく、数秒かかります。したがって、デバッグビルドとリリースビルドの間で異なることがたくさんある可能性が高いと結論付けます。最適化には最適化なしよりも時間がかかるはずですが、これらの他のデバッグのみのアクティビティにはそれよりも時間がかかる必要があります。デバッグとリリースの時間が正確にどこにあるかを確認できればいいのですが、それらはまったく異なるプロセスであり、少なくともVisual Studio 2005と私がベンチマークしたプロジェクトでは、デバッグにかなり時間がかかることは明らかです。

于 2013-05-02T13:30:27.813 に答える