Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT并行编译与顺序编译_Java_Gwt_Ant_Parallel Processing_Gwt Compiler - Fatal编程技术网

Java GWT并行编译与顺序编译

Java GWT并行编译与顺序编译,java,gwt,ant,parallel-processing,gwt-compiler,Java,Gwt,Ant,Parallel Processing,Gwt Compiler,我试图减少ant构建完成所需的时间。大部分构建时间由GWT编译器占用 <target name="gwtc" description="GWT compile to JavaScript"> <parallel threadsperprocessor="16"> <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler"> ........

我试图减少ant构建完成所需的时间。大部分构建时间由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>
下面的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工程师决定不将其并行化到超出限制的程度


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

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

您已经将localWorkers设置为16。这是许多并行线程。通过传递两个任务,只需将线程数增加一倍。如果你从增加这个数字中获得了任何性能提升,尽管你的结果看起来令人惊讶(要么你的应用程序很小,要么你的电脑是个怪物),但还是去吧

据我所知,顺序编译模块与并行编译模块相比没有任何优化好处。您总是可以通过查看编译代码的大小来验证它

你可能会发现这篇文章很有趣:


在第一种情况下,CPU不能100%运行。该任务是CPU密集型任务,但并不使用机器上的所有CPU线程。它只最大化了几个内核/线程,而其他内核/线程保持空闲。这就是为什么在第二种情况下并行运行更多任务可以减少编译时间的原因。谢谢你的链接,是的,我应该比较一下每种情况下输出文件的CRC。除了8个localWorkers之外,我没有得到任何改进,我有一台功能非常强大的计算机,内存为32GB。这种改进不是因为编译器参数中定义了local Worker,而是因为Ant并行运行两个编译器任务。这是在具有16个CPU踏板的双四元Xeon机器上。您说两个编译器任务中的32个线程的运行速度明显快于单个编译器任务中的32个线程的运行速度。例如,如果您没有为单个编译器任务提供足够的内存,我想这是可能的。我知道您在说什么-上下文切换开销。不要把这些数字当回事……我只是在使它并行时复制粘贴了两次相同的代码片段。我担心的是,在解决这个问题之前,不会在所有内核上使用100%,也不会担心上下文切换开销。添加任务后,所有核心都达到100%,现在我可能会将工作人员的数量更改为最佳值,以减少不必要的上下文切换。