gradle - Gradle 与 Bazel 的构建性能
问题描述
所以现在每个人都在谈论 bazel,但是迁移到它不是自动化的(从 maven 迁移时,在这方面 gradle 更好)。所以我不想花时间手动将任何存储库转换为它。
但我找不到任何有关最新版本 gradle (5.6 >) 和 bazel (1.0) 之间构建速度差异的信息。
任何人都可以分享一个链接或他自己的经验吗?我最感兴趣的是仅更改了几个文件的增量构建。
解决方案
Dropbox最近运行了一些基准测试:
请注意,对于 Bazel 而言,没有缓存场景的干净构建要慢得多,而增量构建场景要快得多。
Bazel 构建单元的粒度往往比 Gradle 的更小。java_library
看到只有一个源文件的目标是很常见的。这些构建单元中的命令行操作(也称为目标)被单独缓存(本地或远程)并组合在一起以构建一个java_binary
.
对于许多小型构建单元,通常需要执行更多操作,因此需要更多磁盘 I/O 和计算,从而导致较慢的初始、干净构建时间。
这些操作的某些可执行文件也可能具有较高的启动成本(例如javac
),当这些进程多次重新启动时,这些成本就会增加。Bazel 有一种称为持久工作者的机制,其中单个动作的可执行进程(例如,编译器包装器,javac
或)可以在动作执行中持久化,从而节省启动时间并在进程级别启用更低级别的缓存。tsc
scalac
ghc
另一方面,Bazel 的小型构建单元支持高度增量构建和快速迭代开发,如上图所示。
小型构建单元还使 Bazel 能够形成具有高度并行性的依赖关系图。通过远程执行,您可以并行运行 100 和 1000 次小型构建操作。
依赖图也针对无操作构建案例进行了高度优化。如果您的项目没有任何变化,Bazel 应该尽可能少地找出没有任何变化的时间,因此无需做任何事情。
缓慢的干净构建的缺点也可以通过远程缓存、远程执行或不运行相对罕见的来缓解,bazel clean
因为构建的目标是封闭的、确定的和一致的。具有 100% 远程缓存命中的构建在 Bazel 中很常见。
推荐阅读
- c# - 建立连接后如何从服务器(使用连接列表)向客户端发送命令?
- java - Hybris 产品驾驶舱属性部分
- pandas - 在时间之间用时间戳标记行
- php - 奇怪的 Laravel 加密 EncryptString 错误
- dronekit-python - 使用dronekit通过wifi连接bebop parrot无人机
- python - 如何在 python/vtk 中显示 .obj 文件?
- mysql - 将 OVH mysql 数据库链接到我的世界服务器
- regex - url特定部分的正则表达式
- python - pandas - 根据日期提供的 maxtimestamp 在其他列中查找值
- f# - 具有度量单位的 F# 生成类型提供程序