Am 23.01.2016 um 13:17 schrieb Rainer Jung:
Since the calls to filter() are in a hot code path, I wonder whether
using a more complex code instead of a single regexp could be better.
The code should be fast in the common case, which IMHO is the case when
the resource name neither starts with javax nor with org.apache. That
case could be handled by a simple prefix comparison without regexp.
Only when the resource name starts with javax or org.apache (or
org/apache) the various cases to check may make using a regexp be the
better decision. Of course such code is a bit harder to maintain, than a
single regexp.
I think I'll run a simple micro benchmark to get an idea.
The below code nees about 5% of the execution time of the regexp based
one. In some cases 15%. I found no case worse than 15%.
/**
* Filter classes.
*
* @param name class name
* @return <code>true</code> if the class should be filtered
*/
protected boolean filter(String name) {
if (name == null)
return false;
char sep;
boolean javax_or_org_apache;
boolean dot_or_slash;
if (name.startsWith("javax")) {
/* 5 == length("javax") */
sep = name.charAt(5);
if (sep == '.') {
javax_or_org_apache = true;
dot_or_slash = true;
} else if (sep == '/') {
javax_or_org_apache = true;
dot_or_slash = false;
} else {
return false;
}
} else if (name.startsWith("org")) {
/* 3 == length("org") */
sep = name.charAt(3);
/* 4 == length("org.") */
if (sep == '.' && name.startsWith("apache.", 4)) {
javax_or_org_apache = false;
dot_or_slash = true;
/* 4 == length("org/") */
} else if (sep == '/' && name.startsWith("apache/", 4)) {
javax_or_org_apache = false;
dot_or_slash = false;
} else {
return false;
}
} else {
return false;
}
if (javax_or_org_apache) {
if (dot_or_slash) {
/* 6 == length("javax.") */
if (name.startsWith("servlet.jsp.jstl.", 6)) {
return false;
}
if (name.startsWith("el.", 6) ||
name.startsWith("servlet.", 6) ||
name.startsWith("websocket.", 6) ||
name.startsWith("security.auth.message.", 6)) {
return true;
}
} else {
/* 6 == length("javax/") */
if (name.startsWith("servlet/jsp/jstl/", 6)) {
return false;
}
if (name.startsWith("el/", 6) ||
name.startsWith("servlet/", 6) ||
name.startsWith("websocket/", 6) ||
name.startsWith("security/auth/message/", 6)) {
return true;
}
}
} else {
if (dot_or_slash) {
/* 11 == length("org.apache.") */
if (name.startsWith("tomcat.jdbc.", 11)) {
return false;
}
if (name.startsWith("el.", 11) ||
name.startsWith("catalina.", 11) ||
name.startsWith("jasper.", 11) ||
name.startsWith("juli.", 11) ||
name.startsWith("tomcat.", 11) ||
name.startsWith("naming.", 11) ||
name.startsWith("coyote.", 11)) {
return true;
}
} else {
/* 11 == length("org/apache/") */
if (name.startsWith("tomcat/jdbc/", 11)) {
return false;
}
if (name.startsWith("el/", 11) ||
name.startsWith("catalina/", 11) ||
name.startsWith("jasper/", 11) ||
name.startsWith("juli/", 11) ||
name.startsWith("tomcat/", 11) ||
name.startsWith("naming/", 11) ||
name.startsWith("coyote/", 11)) {
return true;
}
}
}
return false;
}
Regards,
Rainer
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org