C++開発者として、C#やJavaのプロジェクトをビルドしたことがあるなら、C++と比較してビルドプロセスがどれほど速いかに驚いたことがあるかもしれません。一部のC++プロジェクトでは、ビルドは数分で済みますが、他のプロジェクトではプロジェクトの規模によって数時間かかることがあります。コンパイルフェーズが利用可能なすべてのコアで並列化されている場合でも、C++のビルドは他の言語のビルドよりもはるかに長くかかることがあります。この有用な Stack Overflowの回答:
- で説明されている理由をいくつか紹介します。 ヘッダーファイル:すべてのコンパイル単位は、数百、時には数千のヘッダーを1: 読み込み、2: コンパイルする必要があります。それらのすべては通常、すべてのコンパイル単位で再コンパイルする必要があります。プリプロセッサにより、ヘッダーのコンパイル結果がすべてのコンパイル単位で 変わる 可能性があるためです。(あるコンパイル単位で定義されたマクロがヘッダーの内容を変更する可能性があります)。これはおそらく 主な 理由です。すべてのコンパイル単位で膨大な量のコードをコンパイルする必要があり、さらにすべてのヘッダーを複数回コンパイルする必要があるからです(それをインクルードするすべてのコンパイル単位ごとに1回)。
- リンク: コンパイルされると、すべてのオブジェクトファイルをリンクする必要があります。これは基本的にモノリシックなプロセスであり、うまく並列化できず、プロジェクト全体を処理する必要があります。
- 解析: 構文は解析が非常に複雑で、コンテキストに大きく依存し、曖昧さの解消が非常に困難です。これには多くの時間がかかります。
- テンプレート: C#では、
List<T>がコンパイルされる唯一の型であり、プログラム内にListのインスタンス化がいくつあっても同じです。C++では、vector<int>はvector<float>とは完全に別の型であり、それぞれが個別にコンパイルされる必要があります。
ビルドプロセスが遅いとどうなるか?
ビルドに10分かかる場合、企業は10分に1日に実行されるビルドの数を掛けた時間を失います。総コストは開発者の数にも依存します。開発者が多いほど、実行されるビルドが多くなり、生産性の損失が大きくなります。
The IncrediBuild ROI計算ツール は、チームにX人の開発者がいて各ビルドにY分かかる場合にどれだけの時間が失われるかの推定を提供します。ただし、この計算ツールは隠れたコストをカウントできないため、楽観的です。例えば、開発者がビルドを開始して10分待たなければならない場合、ウェブの閲覧などの別の活動に切り替え、気が散ってしまうかもしれません。その結果、10分の中断が簡単に15分や20分に変わる可能性があります。
高速なビルドは、開発者が作業中のコードに集中し続けるのに役立ちます。
C++プロジェクトのビルドプロセスをどのように最適化できるでしょうか? いくつかの手法がビルドプロセスの最適化に役立ちます。その一部は こちら
- Pimpl Idiom
- Forward Declarations
- Guard Conditions
- Reduce interdependency
- そしてもちろん、最も広く使用されている手法の1つであるプリコンパイル済みヘッダーです。
ただし、上記の手法を使用するにはいくつかの欠点があります。
- これらのソリューションが本当に適用されていることを確認するのは困難です。定期的なコードレビューが必要です。
- これらのソリューションが正しく適用されている場合でも、時間の節約は限定的な場合があり、非常に大規模なプロジェクトではビルドに依然として数時間かかることがあります。
- ビルド時間の問題に対処するためだけにコードを変更するのは、一般的に悪い考えです。コードは、使用されるビルドプロセスとは独立して設計・実装されるべきです。
C++分散ビルドシステムが救いに
分散ビルドシステムは、コードのコンパイルをネットワーク上の複数のマシンに分散するプログラムです。ローカルコンパイルと常に同じ結果を生成する必要があります。
いくつかの興味深いC++分散ビルドシステムが利用可能です。個人的には、 IncrediBuild。
IncrediBuildは、IncrediBuild Ltd.が開発したグリッドコンピューティングソフトウェアのスイートです。IncrediBuildは、計算集約型のタスクをネットワーク上に分散することで加速するのに役立つように設計されており、主な用途にはソースコードのコンパイル、ソフトウェアのビルド全般、その他のソフトウェア開発関連タスクが含まれます。ジョブはネットワーク上の複数のコンピュータに分散でき、開始したコンピュータだけで利用可能だったリソースよりも多くのリソースを使用して作業を加速する可能性を提供します。

IncrediBuildは、ビルド時間を大幅に削減し、生産的なタスクにより多くの時間を費やすのに役立ちました。
C++のビルドプロセスに時間がかかりすぎる場合は、分散ビルドシステムの使用を検討してください。利用可能なツールを探索し、ニーズに最も適したものを選んでください。
