我被告知要优化网络应用程序。为此,我使用JProfiler。
我注意到很大一部分响应时间都花在了表示层上。特别是,当代码构建HTML代码时。
钻下这个瓶颈,我看到代码与OGNL类/方法有很多关系(近50%的调用)。
我通过删除一些不必要的OGNL语句来调整JSP代码(请参阅下面的详细信息)。我设法获得了200ms。然而,在这个瓶颈中,代码平均花费超过2000毫秒。整体响应时间约为3000毫秒。
从OGNL 2.5.0开始,OgnlContext对象可以自动跟踪表达式的评估。 (...)您可以通过OgnlContext的 lastEvaluation属性访问最后一次评估。
由于我使用Struts 2.3.15.1(OGNL v3.0.6),如何从JSP文件或Action类访问此属性或调用getLastEvaluation
的{{1}}?
JSP文件
OgnlContext
答案 0 :(得分:1)
您可以像
一样访问OgnlContext
OgnlContext context = (OgnlContext) ActionContext.getContext().getValueStack().getContext();
context.setTraceEvaluations(true);
Evaluation evaluation = context.getLastEvaluation();
如何跟踪评估在您在Trace Evaluations
部分中链接的文档中进行了描述您还可以在实例化上下文之前设置系统属性ognl.traceEvaluations
以启用此功能。
答案 1 :(得分:1)
查看您的JSP代码,显而易见的是,罪魁祸首是<s:action>
标签:
你在每次迭代上调用两个动作......基于你正在迭代的行数,可能会成为一个严重的问题。
我会尝试重构那个部分;瓶颈的一个重要部分是解释标签,调用动作,通过拦截器堆栈等机制。
如果您可以生成相同的输出,最大限度地减少对操作的调用,则瓶颈会显着降低。
P.S:一个非常小的优化是改变你的s中的布尔和字符串比较的顺序:if,如果要利用短路(布尔比较更快):
<s:if test="#noAnchor!=true && court == nomenclatureCritere">
子>
修改强>
如果没有
s:action
,效果会更好,但页面需要它们,我不知道如何替换它们
更明确一点,行动应该
当您调用popupNomenExist
时,您唯一的要求是调用服务器,执行某些操作并接收结果以将其注入JSP中。
有几种方法可以获得该结果,并且调用Action可能是最差的(就性能而言,由于上面列出的原因)。
您可以使用execute()
操作的popupNomenExist
方法获取代码,并且:
此外,我们无法争辩在你的popupNomenExist的execute()
方法中正在执行什么,但我想它有可能被重构防止执行每次迭代共有的某些逻辑部分,将它们分组并在迭代之前作为一种缓存执行。