Bazel 加载性能

Bazel 加载性能,bazel,starlark,Bazel,Starlark,为了提高(增量)加载性能,我想将生成的巨大BUILD.bazel文件拆分成更小的.bzl文件 在每个.bzl中,我计划创建一个宏foo,其中包含实际的规则调用: def foo(): foorule("a") foorule("b") ... 在BUILD.bazel中,我会有(很多)负载,比如: load("foo.bzl", foo_0 = "foo") load("other/foo.bzl", foo_1 = "foo") ... 然后通过以下方式触发BUIL

为了提高(增量)加载性能,我想将生成的巨大
BUILD.bazel
文件拆分成更小的
.bzl
文件

在每个
.bzl
中,我计划创建一个宏
foo
,其中包含实际的规则调用:

def foo():
    foorule("a")
    foorule("b")
    ...
BUILD.bazel
中,我会有(很多)负载,比如:

load("foo.bzl", foo_0 = "foo")
load("other/foo.bzl", foo_1 = "foo")
...
然后通过以下方式触发
BUILD.bazel
中的规则:

foo_0()
foo_1()
这比在
.bzl
中计算符号内部的所有规则要快吗

foo = [
     foorule("a"),
     foorule("b"),
]

或者有更好的方法并行加载所有信息吗?

如果我没有弄错的话,这应该会稍微快一点,但最好的方法是将规则分成几个包,这样包加载本身就可以并行化


这里只有云雀加载是并行的。

每个
.bzl
is文件可以并行加载和评估。评估
.bzl
文件包括评估所有顶级语句。如果您有CPU密集型计算,您可以在顶层进行,并将结果存储在全局值中

然而,如果.bzl文件只是定义一些函数,那么几乎没有什么可以并行化的(只需从磁盘加载文件并对其进行解析)。我认为你的情况不会有明显的加速。宏不会并行计算

你有更多的数据吗?您的文件中有多少规则(运行
bazel查询:all | wc-l
)?加载文件需要多长时间?您确定瓶颈是加载阶段吗

如果您的构建文件很大,我建议您拆分它。如果可能的话,创建多个构建文件。您将获得更多的并行性