web-dev-qa-db-ja.com

SSDでコンパイル時間を短縮

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を持っています。

22
Jamby

C++コンパイル/リンクは、HDD I/Oではなく、処理速度によって制限されます。これが、コンパイル速度の向上が見られない理由です。 (コンパイラ/リンカーバイナリをSSDに移動しても何も起こりません。大きなプロジェクトをコンパイルすると、コンパイラ/リンカーと必要なライブラリがメモリに一度読み込まれ、そこに残ります。)

Cプロジェクトをコンパイルするときに作業ディレクトリをSSDまたはramdiskに移動することでいくつかのマイナーな高速化が見られましたが(テンプレートなどを多用するC++プロジェクトよりもはるかに時間がかかりません)、それに見合うだけの十分なものではありません。

11
us2012

これはすべて、ビルド環境やその他のセットアップに大きく依存します。たとえば、メインのコンパイルサーバーでは、96 GiBのRAMと16コアがあります。HDDはかなり低速ですが、すべてがRAMにキャッシュされているため、それほど問題ではありません。

私のデスクトップ(時々コンパイルすることもあります)には、8 GBのRAMと6つのコアしかありません。同じ並列ビルドを実行すると、SSD速度の違いが非常に顕著になるために、並列で実行されている6つのコンパイラが十分なメモリを消費するため、処理速度が大幅に向上します。

CPUとI/Oの「境界」の比率など、ビルド時間に影響を与える多くの要素があります。私の経験では( [〜#〜] gcc [〜#〜] Linuxの場合)、次のものが含まれます。

  • コードの複雑さ。多くのメタテンプレートにより、CPU時間をより多く使用し、Cのようなコードにより、生成されたオブジェクトのI/Oが(より)支配的になる可能性があります
  • GCCの-pipeなどの一時ファイルのコンパイラ設定。
  • 使用されている最適化。通常、最適化が進むほど、CPU作業が支配的になります。
  • 並列ビルド。一度に1つのファイルをコンパイルしても、今日の最も遅いハードディスクを制限するのに十分なI/Oは生成されません。ただし、一度に8コア(またはそれ以上)でコンパイルすると、可能性があります。
  • 使用されているOS /ファイルシステム。過去の一部のファイルシステムは、並列に構築された多くのファイルのアクセスパターンを制限し、基本的にハードウェアではなくファイルシステムコードにI/Oボトルネックをもたらしたようです。
  • 利用可能RAMバッファリング用。OSがより積極的にI/Oをバッファリングできるほど、HDD速度の重要性は低くなります。このため、make -j6make -j4十分なアイドルコアがあるにもかかわらず。

簡単に言うと、「はい、それはあなたを助ける」または「いいえ、それはあなたを助けません」という純粋な憶測を作るのに十分なものに依存するので、試してみる可能性がある場合は、それを実行してください。ただし、あまり時間をかけすぎないでください。1時間ごとにコンパイル時間を半分にして、自分(または同僚がある場合は同僚)がプロジェクトを再構築できた頻度と、それがどのように関連しているかを見積もってください。節約できる時間。

26
PlasmaHH

コードがSSD(8コアのシステム Core i7 、12 GB RAM)にある場合、約100万行のC++のプロジェクトをコンパイルすると、約2倍高速化されることがわかりました。実際、私たちが得た最高のパフォーマンスは、システム用の1つのSSDとソース用の2番目のSSDでした-ビルドがはるかに高速だったということではありませんでしたが、大きなビルドが進行中のOSははるかに応答性が高かったです。

大きな違いを生んだもう1つのことは、並列ビルドを可能にすることでした。両方を有効にする必要がある2つの個別のオプションがあることに注意してください。

  • メニューツールオプションプロジェクトとソリューション→並列プロジェクトビルドの最大数
  • プロジェクトプロパティ→C++/Generalマルチプロセッサコンパイル

マルチプロセッサのコンパイルは、他のいくつかのフラグ(最小限の再構築を含む)と互換性がないため、出力ウィンドウで警告を確認してください。 MPコンパイルフラグを設定すると、すべてのコアがほぼ100%の負荷に達していたため、少なくともCPUが積極的に使用されていることがわかります。

4
the_mandrill

言及されていない1つの点は、 ccache と高度に並列化されたビルドを使用する場合、SSDを使用する利点が見られるということです。

0
nocnokneo