如何加速gwt编译器?

我们开始在项目中更多地使用GWT, GWT编译器的性能也越来越令人讨厌。

我们将开始改变我们的工作实践来缓解这个问题,包括更加强调托管模式浏览器,它将运行GWT编译器的需要推迟到以后,但这也带来了风险,特别是在真正的浏览器中发现问题的时间比我们希望的要晚得多。

理想情况下,我们希望让GWT编译器本身更快——编译一个相当小的应用程序只需一分钟,这简直是浪费时间。但是,我们使用的编译方式相当简单,所以我希望我们可以快速轻松地获得一些好处。

我们目前正在调用com.google.gwt.dev.Compiler作为一个java应用程序从ant ant目标,最大堆256m和大量的堆栈空间。编译器由Ant使用fork=true和最新的Java6 JRE启动,以尝试并利用Java6改进的性能。我们将主控制器类与应用程序类路径一起传递给编译器,然后就可以运行了。

我们还能做什么来获得额外的速度?我们能不能给它更多的信息,让它花更少的时间去发现该做什么?

我知道我们可以告诉它只编译一个浏览器,但我们需要做多浏览器测试,所以这是不实际的。

在这一点上欢迎任何建议。

104603 次浏览

让我们从一个令人不舒服的事实开始:GWT编译器的性能非常糟糕。您可以在这里或那里使用一些技巧,但不会获得明显的性能提升。

你可以做的一个很好的性能hack是只针对特定的浏览器进行编译,方法是在gwt.xml中插入以下行:

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

或者在GWT 2。X语法,并且仅适用于一种浏览器:

<set-property name="user.agent" value="gecko1_8"/>

例如,这将只编译IE和FF的应用程序。如果您知道您只使用特定的浏览器进行测试,您可以使用这个小技巧。

另一种选择:如果您正在使用多个语言环境,并且同样只使用一个语言环境进行测试,您可以将它们全部注释掉,这样GWT将使用默认的语言环境,这将在编译时减少一些额外的开销。

底线:编译器的性能不会得到数量级的提升,但是通过一些放松,您可以在这里或那里节省几分钟的时间。

GWT编译器要做大量的代码分析,因此很难加快它的速度。本会话来自谷歌IO 2008将让你很好地了解GWT在做什么以及为什么它需要这么长时间。

我的建议是开发时尽量使用托管模式,然后只在你想进行测试时进行编译。这听起来确实像您已经得到的解决方案,但基本上这就是为什么有托管模式(好吧,这和调试)。

您可以加快GWT的编译速度,但只针对某些浏览器,而不是GWT默认的5种浏览器。如果你想使用托管模式,确保你至少编译了两个浏览器;如果你为单个浏览器编译,那么浏览器检测代码就会被优化,然后托管模式就不再工作了。

为较少的浏览器配置编译的一个简单方法是创建第二个模块,它继承自你的主模块:

<module rename-to="myproject">
<inherits name="com.mycompany.MyProject"/>
<!-- Compile for IE and Chrome -->
<!-- If you compile for only one browser, the browser detection javascript
is optimised away and then Hosted Mode doesn't work -->
<set-property name="user.agent" value="ie6,safari"/>
</module>

如果rename-to属性设置为相同,则输出文件将与进行完整编译时相同

  • 将应用程序拆分为多个模块或入口点,只在需要时重新编译。
  • 使用中继版本分析您的应用程序-该版本提供编译的故事. c。这可能与1.6版编译器无关,但它可以指示正在发生什么。
如果您使用-localWorkers标志运行GWT编译器,编译器将并行编译多个排列。这让你可以使用多核机器的所有核心,例如-localWorkers 2会告诉编译器并行编译两个排列。 你不会得到数量级的差异(并不是编译器中的所有东西都是可并行的),但如果你编译多个排列,它仍然是一个显著的加速

如果你愿意使用GWT的主干版本,你将能够在任何浏览器上使用托管模式(进程外托管模式),这缓解了托管模式当前的大部分问题。这似乎就是GWT的发展方向——始终使用托管模式进行开发,因为编译不太可能更快。

尽管这篇文章相当古老,而且大多数人可能已经知道了,但我认为值得一提的是GWT 2。X包含一个新的编译标志,通过跳过优化来加速编译。您绝对不应该以这种方式部署编译的JavaScript,但在非生产的连续构建期间,这可以节省时间。

只需在GWT编译器行中包含标志:-draftCompile。

对于GWT 2。我刚刚发现,如果你用

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

您甚至可以指定多个排列。

这是用户列表。代理的价值观你可以设置它为。

(添加这个在这里,因为我一直结束在这里,当我搜索什么,我应该让它只产生一个排列铬。答案是:<set-property name="user.agent" value="safari"/>)

在GWT的新版本中(我认为从2.3或2.4开始),您还可以添加

<collapse-all-properties />

到您的gwt.xml用于开发目的。 这将告诉GWT编译器创建一个覆盖所有地区和浏览器的单一排列。因此,您仍然可以在所有浏览器和语言中进行测试,但仍然只编译一个排列

您可以为生产版本添加一个选项:

< p > -localWorkers 8 - 其中8是计算排列的并发线程数。你所要做的就是把这个数字调整到对你来说更方便的数字。参见GWT编译性能(感谢Dennis Ich的评论)

如果你正在编译到测试环境,你也可以使用:

-draftCompile,它可以实现更快,但不太优化的编译

-optimize 0不优化你的代码(9是最大优化值)

另一件使构建和托管模式性能提高了一倍以上的事情是使用SSD磁盘(现在托管模式工作起来很有魅力)。这不是一个便宜的解决方案,但取决于您使用GWT的程度和您所花费的时间,这可能是值得的!

希望这对你有所帮助!

你可以编译gwt的特定模块 你只需要在你的项目的build.xml中提到要编译的模块

在下面命令的帮助下

ant -Dap.build.javadoc gwt