我正在努力将项目从(JSF 1.2,Richfaces 3.3.4在JBoss 4.2.3上运行)迁移到(JSF 2.2,Richfaces 4.5在Wildfly 8.1.0上运行)。在部分迁移一些视图后,我发现使用JSF 2的应用程序的性能非常糟糕。
我在发送ajax请求时发现了这个问题,尽管render属性指向一个outputText
,但JSF 2正在渲染整个视图示例(可以从HERE下载)
在我的示例中,我将对JSF 1.2和2.2使用相同的代码示例。之后,我将多次点击ajax按钮,并使用chrome检查工具测量每个请求的响应时间。
鉴于以下index1.XHTML使用JSF 1.2和Richfaces 3.3.4
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j">
<head>
</head>
<body id="body">
<!-- Later the outputText elements below will be included here-->
<h:form>
<a:commandButton value="TestBtn" reRender="output"/>
</h:form>
<h:outputText value="test" id="output"/>
</body>
</html>
点击&#34; TestBtn&#34;多次,平均时间是15ms:
鉴于以下index2.XHTML使用JSF 2.2和Richfaces 4.5.0
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j">
<h:head>
</h:head>
<h:body id="body">
<!-- Later the outputText elements below will be included here-->
<h:form>
<a:commandButton value="TestBtn" render="output"/>
</h:form>
<h:outputText value="test" id="output"/>
</h:body>
</html>
点击&#34; TestBtn&#34;多次,平均时间是18ms:
好吧,到目前为止一切顺利。现在,当我添加以下outputText元素
时会出现性能问题<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
............. (300 times, of course this is just for testing purposes)
我在index1.xhtml和index2.xhtml中添加了300次这些元素并重复了相同的测试
结果使用index1.xhtml(JSF 1.2),平均时间为19ms
结果使用index2.xhtml(JSF 2.2),平均时间为150ms(!!!!!)
这比JSF 1.2慢8倍
有人可以解释为什么JSF 2比JSF 1慢?以及如何改善表现?
更新
使用tomcat服务器上的元素测试JSF 2示例,我平均20ms。我猜这个问题是由Wildfly方引起的。
不幸的是,我无法改变服务器。我应该找到一个JSF 2的解决方案来处理wildfly。
我尝试升级到wildfly 8.2.0 - &gt;性能问题仍然相同。
我在谷歌搜索后找到的最接近的问题是POST
所以我将JDK升级到jdk1.7.0_71 - &gt;性能问题仍然相同。
更新2
这是发送到Wildfly服务器的ajax请求(一次点击)的日志。 (LOG)
为什么JSF构建整个视图,虽然我只是重新呈现特定的ID?
**注意:我不知道这是JSF假设的工作方式,或者我只是在滥用它。 **
先谢谢, 特发
答案 0 :(得分:4)
我终于找到了为什么ajax对Wildfly的反应对我来说很慢。
事实证明,此性能问题与JSF版本或mojarra版本无关。它实际上与Wildfly配置有关(Weld是具体的)
&#34; org.jboss.as.weld&#34;在我的wildfly服务器中被禁用。默认情况下,当您下载wildfly时,它会启用。这就是为什么没有人遇到任何性能问题。
要在Wildfly中启用/禁用焊接,只需在&#34; {JBOSS_HOME} / standalone / configuration&#34;中找到的standalone.xml中添加/删除以下两行。 (扩展和子系统):
<extensions>
..............
<extension module="org.jboss.as.weld"/>
..............
</extensions>
<profile>
..............
<subsystem xmlns="urn:jboss:domain:weld:2.0"/>
</profile>
如果您删除焊接并尝试我在问题中提到的示例,您应该延迟ajax响应
我不知道为什么禁用焊接会导致此问题,但这是与当前问题无关的不同问题。
希望这可以帮助某人
答案 1 :(得分:0)
我测试了你的例子,但使用着名的Primefaces而不是Richfaces。它为每个按钮点击响应时间提供了12毫秒。我怀疑Richfaces命令按钮javascript代码可能有问题。您可以下载Primefaces,进行相同的测试,然后回到这里告诉我它是快还是慢。
答案 2 :(得分:0)
我在没有Richfaces的情况下运行你的例子,使用h:commandButton和300个outputTexts绑定到bean属性,用panelGroup包装。虽然存在差异,但不是地球喋喋不休。但是,为Mojarra团队创建一个JIRA问题可能值得研究。
以下是我的结果。我抛弃了第一个请求以排除任何初始化效果。最明显的区别可能是最后5个请求的平均值,因为响应时间停止了那个时间的波动(可能是一些优化启动)。
使用Mojarra 2.2.6:
Sample size: 20
Total time: 2111 ms
Average time: 105.55 ms
STDDEV: 22.01
Last 5 average: 85.40 ms
使用Mojarra 2.1.28:
Sample size: 20
Total time: 1331 ms
Average time: 66.55 ms
STDDEV: 29.94
Last 5 average: 39.60 ms