如何减少Bazel构建过程中Analysis Phase的耗时
Bazel Analysis Phase 耗时优化方案
0. 先定位具体耗时点
- 执行
bazel analyze-profile --html profile.gz //你的构建目标生成分析阶段的耗时统计和火焰图,先确认是特定规则、BUILD文件还是全局逻辑导致的耗时,再针对性优化。
1. 启用分析阶段缓存
- Bazel 6+ 版本默认开启分析结果持久化缓存,老版本可手动添加
--experimental_analysis_cache参数启用,配合--disk_cache或远程缓存可以直接复用未变更目标的分析结果,避免重复计算。 - 可添加
--experimental_skip_analysis_entry_validation参数跳过非必要的缓存校验逻辑,进一步提升缓存命中率。
2. 简化BUILD/.bzl文件逻辑
- 减少
glob()递归调用的深度,不要使用glob(["**/*.cpp"])这类全目录递归扫描,递归扫描文件是分析阶段耗时的常见大头,优先指定明确的子目录路径,比如glob(["src/*.cpp", "src/submodule/*.cpp"])。 - 避免在BUILD/.bzl文件中执行重计算逻辑,包括复杂字符串处理、多层循环、非必要的外部命令调用(如
repository_ctx.execute),这类逻辑尽量迁移到仓库规则的执行阶段,不要放在分析阶段运行。 - 拆分体量过大的BUILD文件,单个BUILD文件内的目标数不要过多,拆分为子目录下的多个BUILD文件,降低单个文件的解析和分析负载。
3. 裁剪不必要的目标与依赖
- 使用
--build_tag_filters过滤当前构建不需要的目标,比如测试用例、示例代码可添加manual标签,默认不参与分析流程。 - 执行
bazel query 'deps(//:your_target)'排查冗余传递依赖,删除不必要的依赖可以直接减少需要分析的目标总量。 - 非测试构建场景可添加
--trim_test_configuration参数,裁剪测试相关的不必要配置分析逻辑。
4. 工具侧性能优化
- 升级到最新Bazel LTS版本,每个大版本都会对分析阶段做大量性能优化,较老版本通常可获得30%以上的分析效率提升。
- 给Bazel分配足够的运行内存,在
.bazelrc中添加startup --host_jvm_args=-Xmx16G(根据机器内存调整,至少分配8G以上),避免分析阶段JVM频繁GC拖慢速度。 - 开启并行分析,添加
--experimental_parallel_analysis参数,多核机器上Bazel会并行分析无依赖的目标,大幅降低整体分析耗时。
内容的提问来源于stack exchange,提问作者lzf
相关产品推荐
相关产品推荐

