0

我试图减少完成 ant 构建所需的时间。大部分构建时间由 GWT 编译器占用。

以下 ant 脚本是根据官方 GWT 示例中的脚本行编写的。注意两个 GWT 模块是如何传递给编译器的。当您运行此脚本时,GWT 编译器会按顺序编译这两个模块。

<target name="gwtc" description="GWT compile to JavaScript">
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
        ........
        ........

        <arg value="com.af.gwtmodules.dashboard.Dashboard" />
        <arg value="com.af.gwtmodules.administration.Administration" />
        <arg line=" -localWorkers 16" />
    </java>
</target>

我将任务更改为并行运行 2 个编译任务,并且在每个任务中我只将一个 GWT 模块传递给编译器。

<target name="gwtc" description="GWT compile to JavaScript">
<parallel threadsperprocessor="16">
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
        ........
        ........

        <arg value="com.af.gwtmodules.dashboard.Dashboard" />
        <arg line=" -localWorkers 16" />
    </java>

    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
        ........
        ........

        <arg value="com.af.gwtmodules.administration.Administration" />
        <arg line=" -localWorkers 16" />
    </java>

</parallel>
</target>

这确实像预期的那样运行得更快。但是,我想知道 GWT 编译器是否可以在代码优化方面做得更好,如果一次给所有模块而不是单独给每个模块。例如,这两个模块使用了很多通用代码。所以如果编译器可以一次看到整个代码库,它可以找到更多的冗余代码。理论上,它可以为公共代码创建单个 JS 工件,并为不常见的代码创建单独的 JS 工件。这将减少访问这两个模块的用户的下载时间,因为公共 JS 工件只会下载一次。

据我了解,GWT 模块是独立的,因此不会有跨模块优化。但是 GWT 编译器内部没有并行化这一事实使我认为可能存在一些跨模块优化或其他后果,因此 Google 工程师决定不将其并行化超过限制。

我想知道并行化编译方式是否对生成代码的质量有任何影响。

4

1 回答 1

1

如果您的 CPU 以 100% 运行,或者您使用了所有可用内存,那么您并行运行多少个任务并不重要。事实上,通过并行推送任务,您可能会减慢而不是提高性能。

您已经将 localWorkers 设置为 16。这是很多并行线程。通过传递两个任务,您只需将线程数加倍。如果你通过增加这个数字得到任何性能改进 - 去吧,尽管你的结果看起来令人惊讶(你的应用程序非常小或者你的计算机是一个怪物)。

据我所知,顺序编译模块与并行编译模块没有优化优势。您始终可以通过查看已编译代码的大小来验证它。

你可能会觉得这篇文章很有趣:

GWT 编译性能

于 2014-06-12T16:41:19.310 回答