【问题标题】:Loading performance加载性能
【发布时间】:2017-07-11 10:37:36
【问题描述】:

为了(增量)加载性能,我想将一个巨大(相信我)生成的 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"),
]

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

【问题讨论】:

    标签: bazel starlark


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      如果您的 BUILD 文件很大,我建议您将其拆分。如果可能,请改为创建多个 BUILD 文件。您将获得更多的并行性。

      【讨论】:

        猜你喜欢
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多