Build Cache - 预编译标头如何影响效率
此功能仅在 Incredibuild 的 Enterprise and Business Plans 中可用,且当前的可用性有限。欲了解更多详情,请联系您的客户代表。
完全支持预编译标头 (PCH) ,但根据其定义方式,其可能会影响 Build Cache 性能。如果 PCH 包含频繁更改的标头,则在大多数构建过程中需要重新编译 PCH。这意味着任何依赖于 PCH 的源代码也需要重新编译,这可能导致构建缓存命中率降低。
预编译标头的作用
预编译标头文件可以更快地编译多个源文件使用同一标头集的大型项目。这些标头文件被预编译(一次)成一个中间代码,用于编译多个源文件。因此,编译器无需反复预处理所有标头文件,从而减少构建时间。
例如,考虑 source1.cpp 到 source25.cpp 均使用 header1.h 到 header7.h 的标头。将所有 7 个标头文件一次预编译到一个 PCH 文件,可以使所有 25 个编译使用预编译标头文件,在大多数情况下,这种方法速度更快。
您可以通过 CL 命令中的 /YC 选项来识别预编译标头创建。
预编译标头问题
考虑上述示例,我们假设 source13.cpp 只需要 header1.h(其不需要 header2.h 到 header7.h)。这意味着 header1.h 中的任何更改都会导致 source13.cpp 重新编译。
但如果在编译 source13.cpp 时使用预编译标头,则 header2.h 中的任何更改均会导致预编译标头重新编译,这也会导致 source13.cpp 重新编译。
这种情况可能发生在增量构建和 Build Cache 中。
预编译标头的不当结构可能会导致不必要的重新编译(即缓存未命中)。例如,如果您将所有项目标头放在一个巨大的预编译标头文中,则对任何标头的更改(这种情况经常发生)都会导致整个项目重新编译。
最好不要在一个预编译标头中混合频繁更改的标头和很少更改的标头。
识别结构不正确的预编译标头
如果构建持续显示低命中率,请启用详细构建输出(请参阅 Examining Cache Efficiency Further)。如果许多缓存未命中显示预编译标头(PCH 文件)是未命中原因,则该预编译标头可能包含频繁更改的标头,并且包含在大多数源文件中。
使用预编译标头的最佳实践
请勿将频繁更改的标头放在预编译标头中。当然,还需避免将其与很少更改的标头混合。