21

大規模な C++ プロジェクトのコンパイル時間を短縮したいと考えています。プリコンパイルされたヘッダー、インターフェイスなどを使用しようとしましたが、先に進む前に、コンパイル時間が非常に長い理由を検出するのに役立つツールがあるかどうかを知りたいです。誰かが pc-lint を提案してくれました。 大規模な C++ プロジェクトで不要な #include ファイルを検出するにはどうすればよいですか? しかし、コンパイル時間を分析し、コンパイル速度を上げるためのヒントについて話す他のツールがある場合は、お知らせください。前もって感謝します。

環境: Microsoft Visual Studio C++ 2008 または 2010。

4

4 に答える 4

5

私が気に入っているアプローチの 1 つは、いくつかのソースのプリプロセッサ出力を確認することです。その一部を、多少抽象化された表現ではなく、コンパイラの観点から読んでください#inclu。必要のないインクルード/ライブラリの大きなチャンクが見つかり、依存関係/インクルードの存在 (または必要性) を必ずしも認識していない可能性があります。そこから、削除できる依存関係を決定します。依存関係がすべて正しかったとしても、大きな出力は、大きなモジュールを小さな断片に分割する方法を示唆している可能性もあります。

于 2012-05-14T06:16:42.990 に答える
4

C ++は(まだ)モジュール式ではないため、コンパイルのボトルネックは多くの場合、問題が含まれていることが原因です。それは、必要のないときにあまりにも多くのファイルを含めることを使用しています。これらのインクルードが現時点で必要である可能性もありますが、いくつかの単純なリエンジニアリングで不要になる可能性があります。

ツールは自給自足で文書化されているので、レビュープロセスについて少し詳しく説明します。

  1. 2つ以上のヘッダーがある場合は、#include非常に疑わしいものです。
  2. 逆に、さまざまなタイプと関数がぎっしり詰まったソースファイルがあり、インクルードが2つしかない場合は、ヘッダーの1つが多すぎることを意味している可能性があります。

何が必要か、何が必要でないか、余分なヘッダーを削除する方法がわからない場合は、Pimpls-信頼できるビューティーマークを読むことをお勧めします。Pimplが何であるかわからない場合は、CompilationFirewallsをお読みください。ただし、Pimplには実行時間とメンテナンスのコストがかかるため、本当に必要な場合にのみ使用してください。個人的には、サードパーティに提供するライブラリのパブリックヘッダー(ABI互換性)で絶対にお勧めします。それ以外の場合は避けてください。

手動検査が得意でない場合は、ヘッダーごとにプリプロセッサ出力を生成し(ソースファイルについてはあまり気にしないでください)、より大きな出力を確認できます。

于 2012-05-14T06:46:53.883 に答える
3

私はコンパイル時間を改善するためのツールを認識していませんが、提案できる手動の救済策はほとんどありません(これはコメントと考えてください):

  1. 複数のインクルード#includeが問題を起こさないように、すべてのヘッダー ファイルにガードを付けます。
  2. ヘッダー ファイルに直接配置するメンバー関数本体、インライン関数本体を削減します。彼らの宣言を持っているだけです
  3. template不要な関数やクラスがないか確認してください。テンプレートはinlineデフォルトで になることに注意してください。テンプレート/メタプログラミングが多すぎると、コンパイルに膨大な時間がかかります。
  4. の数#defineが不必要に多い場合、前処理ステージが増加し、最終的にコンパイル時間が長くなります
于 2012-05-14T05:24:03.157 に答える
2

Unityビルドを調べることができます。
基本的に、すべての.cppファイルを 1 つの .cpp ファイルに含め、その 1 つのファイルのみをコンパイルします。大きなプロジェクトでテストしたところ、非常に効果的でした。
これは、cpp ごとではなく、すべてのヘッダー/cpp を一度に含めると、使用する I/O がはるかに少なくなるため機能します。

SSD ハードウェアをアップグレードしたので、ユニティ ビルドは使用しなくなりました。

Unity ビルドに関する関連する SO の質問は次のとおりです: #include all .cpp files into a single compilation unit?

于 2012-05-14T09:45:38.037 に答える