我试图减少完成ant构建所需的时间。大多数构建时间由GWT编译器完成。
以下ant脚本写在官方GWT示例中的脚本行上。 注意两个GWT模块如何传递给Complier。运行此脚本时,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编译器内部没有并行化的事实使我认为可能存在一些交叉模块优化或其他后果,因为谷歌工程师决定不将其并行化超出限制。
我想知道如果并行编译我的方式,对生成代码的质量有任何影响。
答案 0 :(得分:1)
如果您的CPU运行率为100%或者您使用了所有可用内存,那么并行运行的任务数并不重要。实际上,通过并行推送任务,您可能会降低性能,而不是改善性能。
你已经将localWorkers设置为16.这是很多并行线程。通过传递两个任务,您只需将线程数加倍。如果你通过增加这个数字来获得任何性能提升 - 那就去吧,虽然你的结果看起来很惊人(你的应用程序非常小或者你的计算机是个怪物)。
据我所知,从顺序编译模块到并行编译模块没有优化优势。您始终可以通过查看已编译代码的大小来验证它。
你可能会觉得这篇文章很有意思: