我如何加快gwt编译器?
我们开始在我们的项目中更多地使用GWT,GWT编译器的性能变得越来越令人讨厌。
我们将开始改变我们的工作实践,以缓解这个问题,包括更加重视托pipe模式浏览器,这种浏览器推迟到稍后才运行GWT编译器,但这会带来自身的风险,尤其是没有捕捉真正的浏览器问题,直到比我们想要的晚得多。
理想情况下,我们希望让GWT编译器本身更快 – 编写一个相当小的应用程序的一分钟就是不必要的。 但是,如果我们使用相当天真的方式进行编译,那么我希望我们能够取得一些快速和轻松的成果。
我们目前正在调用com.google.gwt.dev.Compiler作为一个来自Ant Ant目标的Java应用程序,最大的堆是256m,堆栈空间很大。 编译器由Ant使用fork = true和最新的Java 6 JRE启动,试图利用Java6的改进性能。 我们将主控制器类与应用程序类path一起传递给编译器,然后closures它。
我们还能做些什么来获得额外的速度? 我们可以给它更多的信息,所以它花费更less的时间来发现做什么?
我知道我们可以告诉它只为一个浏览器编译,但我们需要做多浏览器testing,所以这不是很实际。
所有的build议欢迎在这一点上。
让我们从令人不安的事实开始吧:GWT编译器的性能真的很糟糕。 你可以在这里和那里使用一些黑客,但是你不会获得更好的性能。
一个很好的性能破解你可以做的只是编译只有特定的浏览器,通过在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应用程序。 如果你知道你只使用一个特定的浏览器进行testing,你可以使用这个小黑客。
另一个select是:如果您使用的是多个语言环境,并且只使用一个语言环境进行testing,则可以将它们全部注释掉,以便GWT使用默认的语言环境,这样可以减less编译时的额外开销。
底线:你不会在编译器性能上有数量级的提高,但是需要放松一些,你可以在这里和那里削减几分钟。
如果使用-localWorkers标志运行GWT编译器,编译器将并行编译多个排列。 这可让您使用多核机器的所有内核,例如-localWorkers 2将告诉编译器并行编译两个排列。 你不会得到大小差异的顺序(并非编译器中的所有东西都是可并行的),但是如果编译多个排列,它仍然是一个明显的加速。
如果您愿意使用GWT的中继版本,则可以将托pipe模式用于任何浏览器( 进程外托pipe模式 ),从而减轻托pipe模式中的大部分当前问题。 这似乎是GWT正在进行的地方 – 总是以托pipe模式发展,因为编译不可能更快。
虽然这个入口已经很老了,而且大多数人可能已经知道了,但我认为值得一提的是,GWT 2.x包含一个新的编译标志,通过跳过优化来加快编译速度。 您绝对不应该以这种方式部署JavaScript,但在非生产连续构build期间它可以节省时间。
只需将flag:-draftCompile包含到您的GWT编译器行即可。
在较新版本的GWT(我相信开始2.3或2.4),你也可以添加
<collapse-all-properties />
到你的gwt.xml进行开发。 这将告诉GWT编译器创build一个覆盖所有语言环境和浏览器的单一排列。 因此,您仍然可以在所有浏览器和语言中进行testing,但仍然只编译一个排列
以下是您可以设置的user.agent值的列表 。
(在这里添加这个,因为当我search我应该设置的东西时,我总是在这里结束,使它只产生一个chrome的排列组合,答案是: <set-property name="user.agent" value="safari"/>
)
GWT编译器正在进行大量的代码分析,所以很难加快速度。 来自Google IO 2008的这个会话将会告诉你GWT在做什么以及为什么需要这么长时间。
我的build议是尽量使用托pipe模式进行开发,然后只在您想要testing的时候进行编译。 这听起来像你已经达到的解决scheme,但基本上这就是为什么托pipe模式(那么,debugging)。
你可以加快GWT编译,但只能编译一些浏览器,而不是GWT默认的5种。 如果你想使用托pipe模式,请确保至less编译两个浏览器; 如果您为单个浏览器编译,那么浏览器检测代码将被优化,然后托pipe模式不再工作。
configuration较less浏览器的简单方法是创build一个从主模块inheritance的模块:
<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
属性设置为相同,则输出文件将与完成编译时相同
您可以添加一个选项到您的版本生产:
-localWorkers 8
– 其中8是计算排列的并发线程数。 你所要做的就是把这个号码调整到对你来说更方便的号码。 请参阅GWT编译性能 (感谢Dennis Ich评论)。
如果您正在编译testing环境,则还可以使用:
-draftCompile
,它可以实现更快速但不太优化的编译
-optimize 0
,不优化你的代码(9是最大优化值)
构build和托pipe模式性能提高一倍以上的另一件事是使用SSD磁盘(现在托pipe模式就像一个魅力)。 这不是一个便宜的解决scheme,但取决于你使用GWT的多less和你的时间成本,这可能是值得的!
希望这可以帮助你!
- 将应用程序拆分为多个模块或入口点,然后只在需要时重新编译。
- 使用trunk版本分析你的应用程序 – 它提供了编译的故事 。 这可能与1.6编译器相关,也可能不相关,但可以指示发生了什么。
控制编译排列将会很有帮助,请通过以下链接详细解释:
控制置换爆炸:条件属性
控制置换爆炸:SoftPermutations
对于GWT 2.x,我刚刚发现,如果你使用
<set-property name="user.agent" value="ie6"/> <extend-property values="ie8,gecko1_8" name="user.agent"/>
你甚至可以指定多个排列。