首页 > 解决方案 > Gradle 与 Bazel 的构建性能

问题描述

所以现在每个人都在谈论 bazel,但是迁移到它不是自动化的(从 maven 迁移时,在这方面 gradle 更好)。所以我不想花时间手动将任何存储库转换为它。

但我找不到任何有关最新版本 gradle (5.6 >) 和 bazel (1.0) 之间构建速度差异的信息。

任何人都可以分享一个链接或他自己的经验吗?我最感兴趣的是仅更改了几个文件的增量构建。

标签: gradlebuildbazel

解决方案


Dropbox最近运行了一些基准测试:

在此处输入图像描述

请注意,对于 Bazel 而言,没有缓存场景的干净构建要慢得多,而增量构建场景要快得多。

Bazel 构建单元的粒度往往比 Gradle 的更小。java_library看到只有一个源文件的目标是很常见的。这些构建单元中的命令行操作(也称为目标)被单独缓存(本地或远程)并组合在一起以构建一个java_binary.

对于许多小型构建单元,通常需要执行更多操作,因此需要更多磁盘 I/O 和计算,从而导致较慢的初始、干净构建时间。

这些操作的某些可执行文件也可能具有较高的启动成本(例如javac),当这些进程多次重新启动时,这些成本就会增加。Bazel 有一种称为持久工作者的机制,其中单个动作的可执行进程(例如,编译器包装器,javac或)可以在动作执行中持久化,从而节省启动时间并在进程级别启用更低级别的缓存。tscscalacghc

另一方面,Bazel 的小型构建单元支持高度增量构建和快速迭代开发,如上图所示。

小型构建单元还使 Bazel 能够形成具有高度并行性的依赖关系图。通过远程执行,您可以并行运行 100 和 1000 次小型构建操作。

依赖图也针对无操作构建案例进行了高度优化。如果您的项目没有任何变化,Bazel 应该尽可能少地找出没有任何变化的时间,因此无需做任何事情。

缓慢的干净构建的缺点也可以通过远程缓存、远程执行或不运行相对罕见的来缓解,bazel clean因为构建的目标是封闭的、确定的和一致的。具有 100% 远程缓存命中的构建在 Bazel 中很常见。


推荐阅读