https://bz.apache.org/bugzilla/show_bug.cgi?id=69377
Bug ID: 69377
Summary: JSP optimization via custom code generation
Product: Tomcat 9
Version: 9.0.x
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P2
Component: Jasper
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: -----
Similar to the older issue https://bz.apache.org/bugzilla/show_bug.cgi?id=64872
from 2020, there is an opportunity to improve performance via a narrow
violation of the spec. As spec violations are not OK by default, an opt-in
solution is required. If implemented correctly and activated, there can be
significant performance improvements.
In short, I would like to optimize my application by translating some <c:set/>
calls into direct pageContext writes. For example, the current code:
private boolean _jspx_meth_c_005fset_005f0(javax.servlet.jsp.PageContext
_jspx_page_context)
throws java.lang.Throwable {
javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
// c:set
org.apache.taglibs.standard.tag.rt.core.SetTag _jspx_th_c_005fset_005f0 =
new org.apache.taglibs.standard.tag.rt.core.SetTag();
_jsp_getInstanceManager().newInstance(_jspx_th_c_005fset_005f0);
try {
_jspx_th_c_005fset_005f0.setPageContext(_jspx_page_context);
_jspx_th_c_005fset_005f0.setParent(null);
// /WEB-INF/views/jsp/features/buybox/common/accordionDenarius.jsp(7,0)
name = var type = java.lang.String reqTime = false required = false fragment =
false deferredValue = false expectedTypeName = null deferredMethod = false
methodSignature = null
_jspx_th_c_005fset_005f0.setVar("featureList");
// /WEB-INF/views/jsp/features/buybox/common/accordionDenarius.jsp(7,0)
name = value type = javax.el.ValueExpression reqTime = true required = false
fragment = false deferredValue = true expectedTypeName = java.lang.Object
deferredMethod = false methodSignature = null
_jspx_th_c_005fset_005f0.setValue(new
org.apache.jasper.el.JspValueExpression("/WEB-INF/views/jsp/features/buybox/common/accordionDenarius.jsp(7,0)
'${featureDefinition.subfeatures}'",_jsp_getExpressionFactory().createValueExpression(_jspx_page_context.getELContext(),"${featureDefinition.subfeatures}",java.lang.Object.class)).getValue(_jspx_page_context.getELContext()));
int _jspx_eval_c_005fset_005f0 = _jspx_th_c_005fset_005f0.doStartTag();
if (_jspx_th_c_005fset_005f0.doEndTag() ==
javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
return true;
}
} finally {
org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_c_005fset_005f0,
_jsp_getInstanceManager(), false);
}
return false;
}
can be reduced to:
private boolean _jspx_meth_c_005fset_005f0(javax.servlet.jsp.PageContext
_jspx_page_context)
throws java.lang.Throwable {
javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
pageContext.setAttribute("featureList", new
org.apache.jasper.el.JspValueExpression("/WEB-INF/views/jsp/features/buybox/common/accordionDenarius.jsp(7,0)
'${featureDefinition.subfeatures}'",_jsp_getExpressionFactory().createValueExpression(_jspx_page_context.getELContext(),"${featureDefinition.subfeatures}",java.lang.Object.class)).getValue(_jspx_page_context.getELContext()));
return false
}
Not all invocations of c:set can be replaced this way, and certainly most tags
cannot... however c:set is quite common and this substitution would eliminate
object allocations, try/catch, instance manager work, etc. Coupled with other
optimizations such as ELInterpreterTagSetters, the cost of setting a value can
approach zero.
It's hard to predict the runtime impact, however heap dumps from our
application show that the most commonly-allocated standard tag is
org.apache.taglibs.standard.tag.rt.core.SetTag, followed closely by WhenTag and
IfTag. RemoveTag is likely to win as well, but we use it rarely.
The request for this ticket is to build a mechanism for my application to
override tag generation, based on the tag and its parameters. A non-standard
default similar to StringInterpreterEnum would be gravy.
--
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]