https://bz.apache.org/bugzilla/show_bug.cgi?id=68089
Bug ID: 68089
Summary: ApplicationHttpRequest.getSpecial() and
removeSpecial() use linear scans
Product: Tomcat 9
Version: 9.0.x
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P2
Component: Catalina
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: -----
A high-volume, latency-sensitive application shows a large amount of
String.equals() calls buried inside tomcat processing. Detailed examination
shows that much of it comes from ApplicationHttpRequest.getSpecial() and
removeSpecial(), which are called once per call to request.setAttribute() or
request.removeAttribute(). In our application these calls are from certain
Filters or, more commonly, AstExpressions, especially those which are not
otherwise resolved.
The relevant code is:
protected static final String specials[] =
{ ... };
protected int getSpecial(String name) {
for (int i = 0; i < specials.length; i++) {
if (specials[i].equals(name)) {
return i;
}
}
return -1;
}
The array contains 12 specials, so each call to request.getAttribute(), etc.
performs 12 String comparisons. The occasional search of an actual special
will reduce that, but very few of our calls match.
Suggestion: use a HashMap<String, Integer> or enums to achieve a similar
purpose. Comparable performance data may be found at
https://bz.apache.org/bugzilla/show_bug.cgi?id=67080.
These scans are largely inlined into calling methods so I cannot reliably
estimate the cpu or clock impact, however the sheer number of calls is
impressive.
--
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]