Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Gwt - Fatal编程技术网

Java 如何提高gwt编译器的速度?

Java 如何提高gwt编译器的速度?,java,performance,gwt,Java,Performance,Gwt,我们开始在项目中大量使用GWT,GWT编译器的性能越来越令人讨厌 我们将开始改变我们的工作实践来缓解这个问题,包括更加强调托管模式浏览器,这将把运行GWT编译器的需要推迟到以后,但这也带来了自身的风险,特别是直到比我们希望的要晚得多的时候才发现真实浏览器的问题 理想情况下,我们希望使GWT编译器本身更快—一分钟编译一个相当小的应用程序就可以了。然而,我们使用compileif是一种相当幼稚的方式,因此我希望我们能够快速轻松地获得一些收益 我们目前正在从ant-ant目标调用com.google.

我们开始在项目中大量使用GWT,GWT编译器的性能越来越令人讨厌

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

理想情况下,我们希望使GWT编译器本身更快—一分钟编译一个相当小的应用程序就可以了。然而,我们使用compileif是一种相当幼稚的方式,因此我希望我们能够快速轻松地获得一些收益

我们目前正在从ant-ant目标调用com.google.gwt.dev.Compiler作为java应用程序,最大堆数为256m,堆栈空间很大。Ant使用fork=true和最新的Java6JRE启动编译器,以尝试利用Java6改进的性能。我们将主控制器类和应用程序类路径一起传递给编译器,然后关闭它

我们还能做些什么来提高速度?我们能给它更多的信息,让它花更少的时间去发现该做什么吗

我知道我们可以告诉它只为一个浏览器编译,但我们需要进行多浏览器测试,所以这并不实际


现在欢迎所有建议。

让我们从一个令人不安的事实开始: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编译器正在进行大量的代码分析,因此很难加快速度。这将让您很好地了解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>

如果
重命名为
属性设置为相同,则输出文件将与完整编译时相同

  • 将应用程序拆分为多个模块或入口点,然后仅在需要时重新编译
  • 使用trunk版本分析您的应用程序-它提供了。这可能与1.6编译器有关,也可能与1.6编译器无关,但它可以指示发生了什么

如果使用-localWorkers标志运行GWT编译器,编译器将并行编译多个置换。这允许您使用多核机器的所有核心,例如,localWorkers 2将告诉编译器并行编译两个排列。 您不会得到数量级差异(并非编译器中的所有内容都是可并行的),但如果您正在编译多个排列,这仍然是一个明显的加速


如果您愿意使用GWT的trunk版本,您将能够对任何浏览器()使用托管模式,这将缓解当前托管模式的大多数问题。这似乎就是GWT的发展方向——始终使用托管模式开发,因为编译速度不太可能更快

虽然这个条目很旧,而且大多数人可能已经知道了,但我认为值得一提的是,GWT2.x包含了一个新的编译标志,它通过跳过优化来加快编译速度。您绝对不应该部署以这种方式编译的JavaScript,但在非生产连续构建期间,它可以节省时间


只需将标志:-draftCompile包含到您的GWT编译器行。

对于GWT2.x,我刚刚发现如果您使用

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

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

您可以将其设置为


(在这里添加此项是因为当我搜索应该设置为只为chrome生成置换的内容时,我一直在这里结束。答案是:

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

<collapse-all-properties />

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

您可以在构建中添加一个选项用于生产:

-localWorkers 8
- 其中8是计算置换的并发线程数。你所要做的就是把这个号码调整到你更方便的号码。见(感谢丹尼斯的评论)

如果您正在编译以进行测试
ant -Dap.build.javadoc gwt