C++プロジェクトのコンパイル時間を短縮したいと思います。約3M行のコードがあります。
もちろん、すべてのプロジェクトを常にコンパイルする必要はありませんが、他のユーザーによって変更されたソースファイルがたくさんある場合があり、それらすべてを再コンパイルする必要があります(たとえば、誰かが ASN.1)を更新したとき ソースファイル)。
(すべてのソースファイルを必要としない)中間プロジェクトのコンパイルには約3分かかることを測定しました。私はそれが多すぎないことを知っていますが、コンパイルを待つのが本当に退屈なこともあります。
ソースコードをSSD(古いOCZ Vertex 3 60 GB)に移動しようとしましたが、ベンチマークでは、HDDよりも5〜60倍高速です(特にランダムな読み取り/書き込み)。とにかく、コンパイル時間はほとんど同じです(たぶん2〜3秒速くなりますが、チャンスかもしれません)。
Visual StudioのビンをSSDに移動すると、パフォーマンスがさらに向上しますか?
質問を完了するために:私はW3520 Xeon @ 2.67 GHzと12 GBのDDR3 ECCを持っています。
C++コンパイル/リンクは、HDD I/Oではなく、処理速度によって制限されます。これが、コンパイル速度の向上が見られない理由です。 (コンパイラ/リンカーバイナリをSSDに移動しても何も起こりません。大きなプロジェクトをコンパイルすると、コンパイラ/リンカーと必要なライブラリがメモリに一度読み込まれ、そこに残ります。)
Cプロジェクトをコンパイルするときに作業ディレクトリをSSDまたはramdiskに移動することでいくつかのマイナーな高速化が見られましたが(テンプレートなどを多用するC++プロジェクトよりもはるかに時間がかかりません)、それに見合うだけの十分なものではありません。
これはすべて、ビルド環境やその他のセットアップに大きく依存します。たとえば、メインのコンパイルサーバーでは、96 GiBのRAMと16コアがあります。HDDはかなり低速ですが、すべてがRAMにキャッシュされているため、それほど問題ではありません。
私のデスクトップ(時々コンパイルすることもあります)には、8 GBのRAMと6つのコアしかありません。同じ並列ビルドを実行すると、SSD速度の違いが非常に顕著になるために、並列で実行されている6つのコンパイラが十分なメモリを消費するため、処理速度が大幅に向上します。
CPUとI/Oの「境界」の比率など、ビルド時間に影響を与える多くの要素があります。私の経験では( [〜#〜] gcc [〜#〜] Linuxの場合)、次のものが含まれます。
-pipe
などの一時ファイルのコンパイラ設定。make -j6
がmake -j4
十分なアイドルコアがあるにもかかわらず。簡単に言うと、「はい、それはあなたを助ける」または「いいえ、それはあなたを助けません」という純粋な憶測を作るのに十分なものに依存するので、試してみる可能性がある場合は、それを実行してください。ただし、あまり時間をかけすぎないでください。1時間ごとにコンパイル時間を半分にして、自分(または同僚がある場合は同僚)がプロジェクトを再構築できた頻度と、それがどのように関連しているかを見積もってください。節約できる時間。
コードがSSD(8コアのシステム Core i7 、12 GB RAM)にある場合、約100万行のC++のプロジェクトをコンパイルすると、約2倍高速化されることがわかりました。実際、私たちが得た最高のパフォーマンスは、システム用の1つのSSDとソース用の2番目のSSDでした-ビルドがはるかに高速だったということではありませんでしたが、大きなビルドが進行中のOSははるかに応答性が高かったです。
大きな違いを生んだもう1つのことは、並列ビルドを可能にすることでした。両方を有効にする必要がある2つの個別のオプションがあることに注意してください。
マルチプロセッサのコンパイルは、他のいくつかのフラグ(最小限の再構築を含む)と互換性がないため、出力ウィンドウで警告を確認してください。 MPコンパイルフラグを設定すると、すべてのコアがほぼ100%の負荷に達していたため、少なくともCPUが積極的に使用されていることがわかります。
言及されていない1つの点は、 ccache と高度に並列化されたビルドを使用する場合、SSDを使用する利点が見られるということです。