为什么 bazel 比 gradle 快
why is bazel faster than gradle
最初,我使用gradle
构建我的android项目,但最近,我将其迁移到bazel
,我发现bazel
确实比gradle
,所以我想知道为什么,但是bazel
的文档对此没有给出太多的想法,谁能帮助我?
非常感谢!
完全披露:我在 Bazel 上工作。
这不是一个容易回答的问题,原因有二。首先,性能高度依赖于场景。例如,我们通常期望干净的构建比仅更改单个文件的构建慢。第二,我不知道Gradle内部是如何工作的,他们最近做了很多工作来提高Gradle性能。
但我可以谈谈 Bazel 以及我们正在做些什么来让它变得更快。我们一直致力于构建性能约 10 年,早在我们实现它之前就开始了 public。
关键特征是我们要求声明所有依赖项,并且我们明确地跟踪它们。如果您在 C++ 中使用头文件,或依赖于 Java 库,则必须在您的 BUILD 文件中声明此依赖项(我们强制这些通过沙盒化单个操作声明)。由此产生三种效果:
首先,我们可以高度并行化构建,因为我们知道哪些事物依赖于哪些其他事物。
其次,我们可以非常快速地进行增量构建,因为当您更改特定文件(BUILD 文件、头文件、源文件...)时,我们可以知道构建的哪些部分必须重新完成.
第三,我们几乎不需要进行干净的构建。其他构建工具通常需要 'make clean' 才能进入可预测状态 - 因为 Bazel 了解所有依赖项,所以它可以在每次构建时进入可预测状态。
另一个影响是我们可以远程缓存(即跨用户),甚至可以在另一台机器上执行,尽管在撰写本文时这些都没有得到完全支持。
最初,我使用gradle
构建我的android项目,但最近,我将其迁移到bazel
,我发现bazel
确实比gradle
,所以我想知道为什么,但是bazel
的文档对此没有给出太多的想法,谁能帮助我?
非常感谢!
完全披露:我在 Bazel 上工作。
这不是一个容易回答的问题,原因有二。首先,性能高度依赖于场景。例如,我们通常期望干净的构建比仅更改单个文件的构建慢。第二,我不知道Gradle内部是如何工作的,他们最近做了很多工作来提高Gradle性能。
但我可以谈谈 Bazel 以及我们正在做些什么来让它变得更快。我们一直致力于构建性能约 10 年,早在我们实现它之前就开始了 public。
关键特征是我们要求声明所有依赖项,并且我们明确地跟踪它们。如果您在 C++ 中使用头文件,或依赖于 Java 库,则必须在您的 BUILD 文件中声明此依赖项(我们强制这些通过沙盒化单个操作声明)。由此产生三种效果:
首先,我们可以高度并行化构建,因为我们知道哪些事物依赖于哪些其他事物。
其次,我们可以非常快速地进行增量构建,因为当您更改特定文件(BUILD 文件、头文件、源文件...)时,我们可以知道构建的哪些部分必须重新完成.
第三,我们几乎不需要进行干净的构建。其他构建工具通常需要 'make clean' 才能进入可预测状态 - 因为 Bazel 了解所有依赖项,所以它可以在每次构建时进入可预测状态。
另一个影响是我们可以远程缓存(即跨用户),甚至可以在另一台机器上执行,尽管在撰写本文时这些都没有得到完全支持。