web-dev-qa-db-ja.com

Visual C ++プロジェクト(ネイティブC ++)のコンパイル時間とリンク時間をどのように短縮しますか?

VC++プロジェクト(ネイティブC++)のコンパイル時間とリンク時間をどのように短縮しますか?

各提案がデバッグ、リリース、またはその両方に適用されるかどうかを指定してください。

40
Brian R. Bondy

当たり前のように聞こえるかもしれませんが、タイプが含まれている長い名前空間名を書き出す必要がある場合でも、可能な限り前方宣言を使用するようにしています。

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

他のコンパイラでもコンパイルする時間を大幅に短縮します。確かにそれはすべての構成に適用されます:)

ハンドル/ボディパターン (「pimpl」、「adapter」、「decorator」、「bridge」、「wrapper」とも呼ばれます)を使用します。クラスの実装を.cppファイルに分離することにより、クラスをコンパイルする必要があるのは1回だけです。ほとんどの変更ではヘッダーファイルを変更する必要がないため、1つのファイルを再コンパイルするだけで、かなり大規模な変更を加えることができます。これにより、コンパイル時間が短縮されるため、コメントや単体テストのリファクタリングと書き込みも促進されます。さらに、インターフェイスと実装の問題を自動的に分離するため、コードのインターフェイスが簡素化されます。

21

ビルドプロセスのほとんどの.cppファイルに含める必要があり、あまり頻繁に変更されない大きな複雑なヘッダーがある場合は、それらをプリコンパイルできます。一般的な構成のVisualC++プロジェクトでは、これは単にstdafx.hにそれらを含めるだけの問題です。この機能には欠点がありますが、テンプレートを最大限に活用するライブラリでは、ヘッダーに多くのものが含まれる傾向があります。その場合、プリコンパイル済みヘッダーがビルドを高速化する最も簡単な方法です。

14

nity Builds (スクリーンキャスト ここにあります )を使用します。

8
OJ.

これらのソリューションは、デバッグとリリースの両方に適用され、すでに大きくて扱いにくいコードベースに焦点を合わせています。

前方宣言は一般的な解決策です。

Incredibuildなどの分散型の構築が効果的です。

ヘッダーからソースファイルにコードをプッシュすることは機能します。小さなクラス、定数、列挙型などは、ヘッダーファイルで始まる可能性があります。これは、可能性があります複数のコンパイルユニットで使用されているためですが、実際には1つでのみ使用され、に移動できます。 cppファイル。

私が読んでいないが使用した解決策は、大きなヘッダーを分割することです。非常に大きなヘッダーがいくつかある場合は、それらを確認してください。それらには関連情報が含まれている場合があり、他の多くのヘッダーに依存している場合もあります。他のファイルに依存しない要素...単純な構造体、定数、列挙型、および前方宣言を取得し、それらをthe_world.hからthe_world_defs.hに移動します。これで、多くのソースファイルにthe_world_defs.hのみを含めることができ、そのすべてのオーバーヘッドを含めないようにすることができます。

Visual Studioには、[インクルードを表示]オプションもあり、どのソースファイルに多くのヘッダーが含まれているか、どのヘッダーファイルが最も頻繁にインクルードされているかを確認できます。

非常に一般的なインクルードの場合は、プリコンパイル済みヘッダーに入れることを検討してください。

8
Drew Dormann

XoreaxのIncredibuild を使用して、複数のマシン間で並列にコンパイルを実行します。

7
crashmstr

コンパイル速度の質問は、Stroustrupが彼の [〜#〜] faq [〜#〜] にあるほど興味深いものです。

7
David Norman

Ned Batchelderからの興味深い記事: http://nedbatchelder.com/blog/200401/speeding_c_links.html (Windows上のC++について)。

5
Paweł Hajdan

当社の開発マシンはすべてクアッドコアであり、Visual Studio2008を使用して並列コンパイルをサポートしています。 VSのすべてのエディションでこれができるかどうかはわかりません。

約168の個別プロジェクトを含むソリューションファイルがあり、この方法でコンパイルするには、夏の学生に提供するシングルコアラップトップで約90分であるのに対し、クアッドコアマシンでは約25分かかります。正確に比較できるマシンではありませんが、アイデアは得られます:)

4
user44484

Visual C++には、オブジェクトモジュールの数を減らすことでリンク時間を大幅に改善する、Unityと呼ばれる方法があります。

これには、通常、ライブラリごとにグループ化されたC++コードの連結が含まれます。もちろん、これによりコードの編集がはるかに難しくなり、うまく使用しないと名前空間の衝突が発生します。 「名前空間fooの使用」を使用できなくなります。

当社のいくつかのチームは、通常のC++ファイルを取得し、ビルドステップとしてコンパイル時にそれらを連結するための精巧なシステムを持っています。リンク時間の短縮は非常に大きくなる可能性があります。

2
Matt Shaw

もう1つの便利なテクニックはブロブです。マット・ショーが説明したものと似ていると思います。

簡単に言えば、他のcppファイルを含む1つのcppファイルを作成するだけです。 2つの異なるプロジェクト構成があります。1つは通常の構成で、もう1つはblobです。もちろん、blobbingは、コードにいくつかの制約を課します。名前のない名前空間のクラス名が衝突する可能性があります。

1つのcppファイルを変更するときに(DavidRodríguezが述べたように)BLOB内のコード全体を再コンパイルしないようにする1つの手法は、最近変更されたファイルと他の通常のBLOBから作成された「作業」BLOBを用意することです。

ほとんどの場合、仕事でblobbingを使用します。これにより、プロジェクトのビルド時間、特にリンク時間が短縮されます。

1
alariq

コンパイル時間:
IncrediBuildを使用している場合、コンパイル時間は問題になりません。 IncrediBuildがない場合は、「unitybuild」メソッドを試してください。複数のcppファイルを1つのcppファイルに結合するため、コンパイル全体の時間が短縮されます。
リンク時間:
「ユニティビルド」メソッドもリンク時間の短縮に貢献しますが、それほどではありません。ただし、「グローバル全体の最適化」と「LTCG」が有効になっているかどうかを確認できます。これらのフラグはプログラムを高速にしますが、リンクを遅くします。
「WholeGlobalOptimization」をオフにしてLTCGを「Default」に設定すると、リンク時間が5/6短縮される可能性があります。
(LTCGはリンクタイムコード生成の略です)

0
Jeff Jiang