25

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

4

5 に答える 5

28

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

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

CPU と I/O の「バウンドネス」の比率など、ビルド時間に影響を与える要素は多数あります。私の経験 ( Linux 上のGCC ) では、次のものが含まれます。

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

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

于 2013-03-04T11:45:02.850 に答える
12

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

C プロジェクトをコンパイルするときに、作業ディレクトリを SSD または RAM ディスクに移動することで多少のスピードアップが見られましたが (テンプレートなどを多用する C++ プロジェクトよりもはるかに時間がかかりません)、それだけの価値があるとは言えません。

于 2013-03-04T10:31:09.760 に答える
5

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

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

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

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

于 2013-03-04T14:04:45.260 に答える
-3

C++ プロジェクトのコンパイル時間を短縮することを期待して、ハード ディスク ドライブを SSD に交換しました。ハードディスクドライブを SSD に交換しただけでは問題は解決せず、コンパイル時間はどちらもほぼ同じでした。

しかし、初期の失敗の後、コンパイルを約 6 倍高速化することに成功しました。

コンパイル速度を上げるために、次の手順を実行しました。

  1. 休止状態をオフにしました:コマンドプロンプトで「powercfg -h off」

  2. Cドライブのドライブインデックスをオフにしました

  3. ページ ファイルを最小 800/最大 1024 に縮小しました (最初はシステム管理サイズの 8092 に設定されていました)。

于 2014-08-28T19:10:01.283 に答える