1

对于(增量)加载性能,我想将一个巨大的(相信我)拆分BUILD.bazel成更小的.bzl文件。

.bzl然后,我计划在每个中都有一个 Macro 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"),
]

还是有更好的方法来并行加载所有信息?

4

2 回答 2

1

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

这里只有 Skylark 加载将被并行化。

于 2017-07-11T11:05:41.427 回答
1

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

但是,如果 .bzl 文件只是定义了一些函数,则几乎不需要并行化(只需从磁盘加载文件并解析它)。我希望在您的情况下没有明显的加速。不会并行评估宏。

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

如果您的 BUILD 文件很大,我鼓励您拆分它。如果可能,请改为创建多个 BUILD 文件。你会得到更多的并行性。

于 2017-07-12T20:04:33.760 回答