UBA 在启用 C++ 编译缓存后是否必须加 -nopch 以及如何权衡 PCH 带来的编译加速 vs 缓存命中率?

我们在 UE5.5 项目里接入了官方推荐的 C++ 编译缓存方案。按照文档建议,目前在本地开发机的编译命令里增加了 -nopch,目的是提高缓存命中率。

实际现象是:

  • 构建机(持续集成)上的缓存命中率整体很好;
  • 如果不加 -nopch,本地几乎命中不了,推测是 PCH 中包含了绝对路径等信息,导致同一份代码在不同机器上命中失败;
  • 但从理性分析来看,完全关掉 PCH 会让每个 CPP 都重新编译那份很大的头文件,理论和实际上的观察都会大幅降低单次编译性能,我们现在也缺少一个量化指标去评估“关 PCH 换高命中率”到底值不值。

想请教几件事:

  1. 在 UE5.5 当前的工具链下,官方是否推荐在启用 C++ 编译缓存时一律加 -nopch?这个建议背后的技术原因是什么?
  2. PCH 中是否确实包含绝对路径等导致跨机器 cache miss 的信息?有没有推荐的参数或配置,可以在保留 PCH 的前提下尽量提升缓存命中率?
  3. 官方是否有推荐的度量方式或经验值,用于评估:在团队开发环境中,关闭 PCH 带来的编译时间损失,和缓存命中率提升之间的取舍?例如:我们应该关注哪些统计指标(命中率区间、全量/增量编译时间等)来做决策?

Steps to Reproduce
接入 UBA 方案, 然后打开 build cache 的共享, 观察命中率

您好,build cache 是依赖 vfs​ 的,VFS 的工作方式是 让UBT 使用虚拟路径而不是本地路径生成所有路径..命令行、rsp文件等等内容。然后,UBT 将虚拟路径注册到 UBA,以便 uba 知道如何将虚拟路径转换为本地路径

这样做的结果是,所有生成的输出(obj 文件、pdb、exe 等)都是可移植的,看起来是一样的..因此可以在计算机之间共享

这个功能在5.6才提供正式支持,5.5上使用需要较多的内容移植​

关闭pch一个主要的原因是pch文件过大,会占用非常大的网络带宽​