【发布时间】:2013-08-11 18:17:17
【问题描述】:
我使用 JSF 的 Mojarra 实现(版本 2.2.1)。我有一个大问题 在 ajax 请求期间具有性能。
我的页面有很多组件,所以我明白为什么第一次渲染需要 很多时间,但是 ajax 请求呢?
虽然他们几乎什么都不做,但他们也需要很多时间。这是我的 简化示例:
在下面的例子中按下“性能测试”按钮需要几个毫秒:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
Hello World
<h:form>
<h:commandButton value="performance test">
<f:ajax execute="@this" render="@none" />
</h:commandButton>
</h:form>
</h:body>
</html>
但如果将 1000 个 <h:inputText /> 元素添加到 <h:form></h:form> 中,则执行相同的操作
超过 100 毫秒!
我检查了 80% 的时间用于 RESTORE_VIEW 阶段,20% 用于 RENDER_RESPONSE 阶段,其余阶段不会花费大量时间。
有没有可能修复它?
我还尝试禁用 javax.faces.PARTIAL_STATE_SAVING(在我的情况下内存消耗不是问题)但也没有任何成功。
编辑:
将一千个 <h:inputText> 添加到 <h:form> 只是一个简化示例。我只是想强调一个事实,即大量组件对 ajax 请求有重大影响(几乎什么都不做)——这在我的网站上是一个严重的问题。
在现实中,当然,我没有 1000 个输入。我显示包含大量数据的非常大的表格 - 如果任何单元格中的数据为空,则应该使用连字符代替。我为此使用了复合组件 - 我有多个 ui:fragment 和 render=true/false
今天我尝试使用自己的组件而不是复合组件 - 响应时间和内存使用量减少了。
但我仍然不满意,因为我在该页面上的非常简单的 ajax 请求比在另一个更薄的页面(即组件数量更少)上使用的相同 ajax 请求花费的时间要多得多。这不是任何 JSF 架构问题吗?
【问题讨论】:
-
100ms 对于一个有 1K 输入字段的怪物表单来说是非常整洁的。另一方面,我想知道谁曾经填写过这样的怪物表格。也许您需要像谷歌那样引入一些搜索/过滤系统?谷歌也不会在没有任何形式的搜索/过滤的情况下一次显示所有的结果。
-
是否可以选择将 JSF 实现切换到 MyFaces?根据此博客blog.oio.de/2013/04/08/jsf-comparison-myfaces-vs-mojarra,该实现(Mojarra 与 MyFaces)在面对大型组件树时确实会产生影响。
-
@BalusC:感谢您的回复。请参阅我的问题中的编辑部分 - 我改进了我的问题的描述。
-
@cheffe:感谢您的回复。我已阅读这篇文章 - 这是一个已更正的错误,请参阅:blog.oio.de/2013/05/16/…
-
你没有告诉任何地方你正在使用复合材料。众所周知,它们具有可衡量的性能影响。另请参阅 stackoverflow.com/questions/6822000/… 以获取一些指南和提示。仅用于条件渲染的复合组件有点奇怪。如果您只需要消除代码重复,最好使用标记文件。