Gradle vs Bazel构建的性能

use*_*095 4 build gradle bazel

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

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

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

Jin*_*Jin 5

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

在此处输入图片说明

请注意,对于Bazel,没有缓存方案的干净构建速度要慢得多,而增量构建方案的速度要快得多。

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

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

这些动作的某些可执行文件也可能具有较高的启动成本(例如javac),这在这些进程多次重新启动时加起来。巴泽尔有一个称为持久性工作者的机制,其中对个人行为的可执行程序(如编译器包装器javactscscalacghc)可以在动作执行持久化,节省启动时间,并允许在进程级缓存甚至更低的水平。

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

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

依赖图也针对无操作构建案例进行了高度优化。如果您的项目没有任何变化,那么Bazel应该花尽可能少的时间来确定没有变化,因此无需执行任何操作。

缓慢清理构建的缺点也可以通过远程缓存,远程执行或不运行相对罕见的漏洞来缓解,bazel clean因为构建的目的是密封,确定性和一致的。Bazel常见具有100%远程高速缓存命中率的构建。

  • 并且没有 28.6 秒的操作时间?如果他们有这样的配置时间,他们可能没有正确使用 gradle。 (2认同)

use*_*095 2

好的,我已经将包含 ~100_000 loc java 的闭源项目迁移到了 bazel。

Gradle 5.6.3与 bazel 1.0.1

正如我所说,我的兴趣在于开发人员的生产力,因此也在于增量构建。

我在 bazel 的 BUILD 中使用了以下内容,所以我没有使用最精细的方法,因为我认为它不是真正可维护的,而且除了拥有大量 devops 的大公司之外,任何人都可以使用它。无论如何,我发现我需要手动执行此操作以提高构建速度,这是 bazel 的缺点。

java_binary(
    srcs = glob(["src/main/java/**/*.java"]),
    resources = glob(["src/main/resources/**"]),
    ...
)
Run Code Online (Sandbox Code Playgroud)

使用一两个更改的文件进行增量构建。

gradle - 1s,bazel - 4.227s

我已经尝试过多次,每次 gradle 都明显更快。我还没有测试过当超过一两个文件被更改时的增量构建,也许在这种情况下 bazel 会与 gradle 相同或更快。

无操作构建 gradle - 700ms, bazel - 0.090ms

因此,速度方面的 gradle 似乎是开发人员生产力的赢家。Bazel 在 gradle 中有更安全的默认设置(默认情况下容易出错),你必须自己启用它,但恕我直言,gradle 的灵活性胜过 bazel 更安全的默认设置。

  • @aljoscha 我知道并且我认为任何理智的现代构建系统都应该自动为我做到这一点。我只能说我想编译java项目。看晃动,介子甚至重做。 (5认同)
  • 如果不让 Bazel 构建细化,那么您基本上就否定了 Bazel 的最大好处。如果您有更多的粒度,那么增量构建时间应该会大大缩短。 (4认同)