【问题标题】:JSF ajax performance issue when using a lot of components使用大量组件时的 JSF ajax 性能问题
【发布时间】: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 个 &lt;h:inputText /&gt; 元素添加到 &lt;h:form&gt;&lt;/h:form&gt; 中,则执行相同的操作 超过 100 毫秒!

我检查了 80% 的时间用于 RESTORE_VIEW 阶段,20% 用于 RENDER_RESPONSE 阶段,其余阶段不会花费大量时间。

有没有可能修复它?

我还尝试禁用 javax.faces.PARTIAL_STATE_SAVING(在我的情况下内存消耗不是问题)但也没有任何成功。

编辑: 将一千个 &lt;h:inputText&gt; 添加到 &lt;h:form&gt; 只是一个简化示例。我只是想强调一个事实,即大量组件对 ajax 请求有重大影响(几乎什么都不做)——这在我的网站上是一个严重的问题。

在现实中,当然,我没有 1000 个输入。我显示包含大量数据的非常大的表格 - 如果任何单元格中的数据为空,则应该使用连字符代替。我为此使用了复合组件 - 我有多个 ui:fragmentrender=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/… 以获取一些指南和提示。仅用于条件渲染的复合组件有点奇怪。如果您只需要消除代码重复,最好使用标记文件。

标签: jsf jsf-2


【解决方案1】:

并非如此,JSF 总是在恢复视图阶段重建整个组件树。在这种情况下,您最好使用&lt;ui:repeat&gt;,但我意识到您的测试是人为的,真实页面可能有很多独特的组件。

有很多方法可以减少组件的数量,比如提到的&lt;ui:repeat&gt;。您也可以在 facelets 中使用纯 html。没有 JSF 标记的 html 块表示为单个 UIInstructions 组件。你仍然可以在那里使用 EL 表达式。如果没有更多关于您的问题场景的详细信息,很难推荐特定的东西。

编辑: 组件树是自上而下恢复的,不知道以某种方式优化它并跳过请求不需要的部分是否可行。问题是你不知道在ajax标签中指定特定id的组件树节点的哪一部分,你只能尝试一些优化。看起来作者并不认为这些并发症值得付出努力。

至于多个条件部分——我在 JSF 中没有找到任何直接支持这一点的东西。一个专门的自定义组件听起来是最好的选择。我们做了类似的事情,我们自己实现了&lt;ui:include&gt;,它支持在&lt;ui:repeat&gt; 中工作的动态src 属性。

【讨论】:

  • 我采纳了您的建议 - 请参阅我问题中的编辑部分。但是“JSF 总是在恢复视图阶段重建整个组件树”呢?不必要的时候会占用大量宝贵的处理器时间(在我看来)。
  • JSF 没有架构问题。我认为这是 Mojarra 中的一个错误。改用 MyFaces 2.1.x,您会发现不同之处。 MyFaces 中复合组件的实现与 Mojarra 中的实现完全不同。使用复合组件时影响很小,但在大多数情况下确实有回报。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多