Bazel构建比Make慢?SKYFUNCTION耗时占47%是否合理?
Bazel构建中SKYFUNCTION耗时占比47%是否合理?
首先直接给结论:这种情况不太合理,尤其是你的项目规模不大,而且对比之前make-js的40秒构建耗时,切换到Bazel后涨到70秒,SKYFUNCTION的高占比大概率是拖慢构建的核心瓶颈。
先看你提供的性能分析数据:
Type Total Count Average ACTION 0.03% 77 0.70 ms ACTION_CHECK 0.00% 4 0.90 ms ACTION_EXECUTE 40.40% 77 912 ms ACTION_UPDATE 0.00% 74 0.02 ms ACTION_COMPLETE 0.19% 77 4.28 ms INFO 0.00% 1 0.05 ms VFS_STAT 1.07% 117519 0.02 ms VFS_DIR 0.27% 4613 0.10 ms VFS_MD5 0.22% 151 2.56 ms VFS_DELETE 4.43% 53830 0.14 ms VFS_OPEN 0.01% 232 0.11 ms VFS_READ 0.06% 3523 0.03 ms VFS_WRITE 0.00% 4 0.97 ms WAIT 0.05% 156 0.56 ms SKYFRAME_EVAL 6.23% 1 10.830 s SKYFUNCTION 47.01% 687 119 ms
为什么说这个占比不合理?
SKYFUNCTION是Bazel核心框架Skyframe的执行单元,负责处理依赖解析、缓存有效性校验、构建规则逻辑计算等工作。对于小规模项目来说,它的耗时占比通常应该远低于ACTION_EXECUTE(你的数据里是40.4%)——毕竟真正的构建执行(比如编译、打包)才应该是耗时主力。
可能的原因和排查方向
这里给你几个具体的排查点,帮你定位问题:
- 缓存未有效命中:如果Bazel的本地/远程缓存没正常工作,每次构建都要重新计算所有依赖关系,会导致Skyframe反复执行SKYFUNCTION。你可以试试
bazel clean --expunge后冷构建一次,再做一次热构建(修改一个无关文件后构建),如果热构建耗时还是很高,说明缓存大概率有问题。 - 构建规则效率低下:如果你用的是
rules_nodejs这类JS相关规则,旧版本或者自定义的规则可能存在冗余计算——比如重复扫描文件、不必要的依赖遍历,或者在Skyfunction里做了同步IO这类低效操作。可以尝试升级到最新稳定版的rules_nodejs和Bazel本身,看是否能缓解。 - 依赖结构冗余:虽然项目规模不大,但如果依赖树嵌套过深、存在大量跨包依赖,Skyframe需要处理的节点会暴增,推高SKYFUNCTION耗时。你可以用
bazel query --nohost_deps --noimplicit_deps 'deps(//your:main-target)'查看依赖结构,看看有没有可以精简的冗余依赖。 - 自定义规则的问题:如果你们写了自定义Bazel规则,检查一下是否在Skyfunction中做了不必要的计算——比如重复读取文件内容、没有缓存计算结果等,这些都会大幅增加耗时。
下一步的具体操作
- 生成更详细的性能分析:执行
bazel build --profile=build-profile.gz,然后用bazel analyze-profile build-profile.gz查看具体哪些SKYFUNCTION耗时最长,直接定位到对应的规则或目标。 - 测试基础规则性能:用最简化的
rules_nodejs规则构建一个空的JS项目,对比SKYFUNCTION的占比,如果这个测试项目的占比正常,说明问题出在你项目的特定配置上。 - 检查缓存配置:确认
~/.cache/bazel目录是否正常读写,有没有配置错误导致缓存失效的情况。
总的来说,小规模项目里SKYFUNCTION占47%耗时是异常的,通过上面的步骤应该能找到瓶颈,优化后大概率能把构建耗时降到甚至低于原来的make-js水平。
内容的提问来源于stack exchange,提问作者ddwolf
相关产品推荐
相关产品推荐

