Я работаю над переносом проекта с (JSF 1.2, Richfaces 3.3.4, работающего на JBoss 4.2.3) на (JSF 2.2, Richfaces 4.5, работающего на Wildfly 8.1.0). После частичного переноса некоторых представлений я обнаружил, что производительность приложения, использующего JSF 2, ужасна.
Я заметил эту проблему, когда отправляется запрос ajax, JSF 2 отображает все представление, хотя атрибут рендеринга указывает на один outputText
Пример (можно загрузить с ЗДЕСЬ)
В моем примере я буду использовать один и тот же образец кода для 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>
Нажав на «TestBtn» несколько раз, среднее время составляет 15 мс:
Учитывая следующий 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>
При многократном нажатии на «TestBtn» среднее время составляет 18 мс:
Ну, пока все хорошо. Теперь проблема с производительностью возникает, когда я добавляю следующие элементы 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)
Я добавил эти элементы 300 раз в index1.xhtml и index2.xhtml и повторил те же тесты.
Результаты с использованием index1.xhtml (JSF 1.2), я получил среднее время 19 мс.
Результаты с использованием index2.xhtml (JSF 2.2), я получил среднее время 150 мс (!!!!!)
Что в 8 раз медленнее, чем JSF 1.2.
Может кто-нибудь объяснить, почему JSF 2 медленнее, чем JSF 1? и как я могу улучшить производительность?
ОБНОВЛЕНИЕ
Тестируя пример JSF 2 с элементами на сервере tomcat, я получил в среднем 20 мс. Я предполагаю, что проблема вызвана со стороны Wildfly.
К сожалению, я не могу менять серверы. Я должен найти решение для JSF 2 для работы на wildfly.
Я попытался перейти на wildfly 8.2.0 --> Все та же проблема с производительностью.
Самая близкая проблема, которую я смог найти после поиска в Google, это POST.
Поэтому я обновил свой JDK до jdk1.7.0_71 -> Все та же проблема с производительностью.
ОБНОВЛЕНИЕ 2
Вот лог ajax-запроса (за один клик), отправленного на сервер Wildfly. (LOG)
Почему JSF строит все представление, хотя я повторно отображаю только определенный идентификатор?
** Примечание. Я не знаю, так ли работает JSF, или я просто неправильно его использую. **
Заранее спасибо, Тефа