Build Cache- コンパイル済みヘッダーが効率に与える影響

現在、この機能は、Incredibuild のEnterprise、および、Business Plans でのみ利用可能で、限定的に提供されています。詳しくは、カスタマーサクセスマネージャーにご相談ください。

事前コンパイル済みのヘッダー(PCH)は完全にサポートされていますが、定義方法によってはBuild Cacheのパフォーマンスに影響を与える可能性があります。PCHに頻繁に変更されるヘッダーが含まれている場合、ほとんどのビルドでPCHを再コンパイルする必要があります。つまり、PCHに依存するソースコードも再コンパイルが必要になり、ビルドキャッシュのヒット率が低下する場合があります。

コンパイル済みヘッダーのロール

コンパイル済みヘッダーは、複数のソースファイルが同じヘッダーセットを使用するような大規模なプロジェクトのコンパイルを高速化します。これらのヘッダーは、一度だけ中間コードに事前コンパイルされ、複数のソースファイルのコンパイルに使用されます。これにより、コンパイラーはすべてのヘッダーを何度も事前処理する必要がなくなり、ビルド時間が短縮します。

例えば、source1.cppからsource25.cppまでがすべてheader1.hからheader7.hまでのヘッダーを使用しているとします。7つのヘッダーすべてを1つのPCHファイルに1度事前コンパイルすることで、25のすべてのコンパイルが事前コンパイルされたヘッダーを使用することができ、ほとんどの場合、より高速化が進みます。

CLコマンドの/YCオプションで、事前コンパイルされたヘッダーを識別することが可能です。

コンパイル済みヘッダーの問題点

上の例で、source13.cppがheader1.hだけを必要とする(header2.hからheader7.hまでは必要ない)と仮定します。つまり、header1.hを変更すると、source13.cppが再コンパイルされることになります。

しかし、もしsource13.cppをコンパイルする際に事前コンパイルされたヘッダーを使用するのであれば、header2.hを変更すると事前コンパイルされたヘッダーが再びコンパイルされ、source13.cppも再びコンパイルされることになります。

これは増分ビルドでも、Build Cacheでも発生する可能性があります。

プリコンパイルされたヘッダーの構造が不適切な場合、キャッシュ ミスなどの不必要な再コンパイルが行われる可能性があります。たとえば、すべてのプロジェクト ヘッダーを1つの巨大なコンパイル済みヘッダに配置した場合、頻繁に起こりうることですが、どのヘッダーを変更してもプロジェクト全体の再コンパイルが発生します。

一つのコンパイル済みヘッダーの中に、頻繁に変更されるヘッダーと、ほとんど変更されないヘッダーを混在させないようにしたほうが、確実な方法と言えます。

不適切な構造のコンパイル済みヘッダーの特定

ビルドのヒット率が継続的に低い場合は、ビルドの詳細出力を有効にしてください(キャッシュ効率をさらに調査する を参照)。多くのキャッシング ミスが、ミスした理由としてコンパイル済みヘッダー(PCHファイル)を示している場合、このコンパイル済みヘッダーには頻繁に変更されるヘッダーが含まれており、ほとんどのソース ファイルに含まれている可能性があります。

コンパイル済みヘッダーの使用に関するベストプラクティス

頻繁に変更されるヘッダーを事前コンパイルされたヘッダーの中に配置しないでください。頻繁に変更されないヘッダーとの混在は確実に避けるべきです。