最初发布在PrimeFaces论坛上@ http://forum.primefaces.org/viewtopic.php?f=3&t=29546
最近,我一直迷恋于评估应用程序的性能,调整JPA查询,用命名查询替换动态SQL查询。就在今天早上,我认识到,getter方法在Java Visual VM中比其他方法更像是HOT SPOT。我的代码(或我的大部分代码)。
吸气方法:
PageNavigationController.getGmapsAutoComplete()
ui:include在index.xhtml中引用
在下面,您将看到PageNavigationController.getGmapsAutoComplete()是Java Visual VM中的一个热点(性能问题)。如果进一步往下看,在屏幕截图上,您将看到PrimeFaces惰性数据表getter方法getLazyModel()也是一个热点,仅当最终用户正在执行许多“惰性数据表”类型的工作/操作/任务时在应用程序中。:)
请参阅下面的(原始)代码。
public Boolean getGmapsAutoComplete() {
switch (page) {
case "/orders/pf_Add.xhtml":
case "/orders/pf_Edit.xhtml":
case "/orders/pf_EditDriverVehicles.xhtml":
gmapsAutoComplete = true;
break;
default:
gmapsAutoComplete = false;
break;
}
return gmapsAutoComplete;
}
由index.xhtml中的以下内容引用:
<h:head>
<ui:include src="#{pageNavigationController.gmapsAutoComplete ? '/head_gmapsAutoComplete.xhtml' : (pageNavigationController.gmaps ? '/head_gmaps.xhtml' : '/head_default.xhtml')}"/>
</h:head>
解决方案:由于这是一个“ getter”方法,因此在调用方法之前先移动代码并为gmapsAutoComplete赋值;参见下面的代码。
/*
* 2013-04-06 moved switch {...} to updateGmapsAutoComplete()
* because performance = 115ms (hot spot) while
* navigating through web app
*/
public Boolean getGmapsAutoComplete() {
return gmapsAutoComplete;
}
/*
* ALWAYS call this method after "page = ..."
*/
private void updateGmapsAutoComplete() {
switch (page) {
case "/orders/pf_Add.xhtml":
case "/orders/pf_Edit.xhtml":
case "/orders/pf_EditDriverVehicles.xhtml":
gmapsAutoComplete = true;
break;
default:
gmapsAutoComplete = false;
break;
}
}
测试结果:PageNavigationController.getGmapsAutoComplete()不再是Java Visual VM中的HOT SPOT(甚至不再显示)
分享这个主题,因为许多专家用户都建议初级JSF开发人员不要在“ getter”方法中添加代码。:)