String.equalsIgnoreCase(...) optimization
Andrey
andrey at tweak.su
Tue Apr 26 14:25:57 UTC 2016
Hello!
I read source code equalsIgnoreCase(...) in String class and saw that it is not optimal. This method check length and call regionMatches(...) with 'constant' values
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1095
...
&& (anotherString.value.length == value.length)
&& regionMatches(true, 0, anotherString, 0, value.length);
...
But regionMatches(...) check 'constant' values
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1338
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
|| (toffset > (long)value.length - len)
|| (ooffset > (long)other.value.length - len)) {
return false;
}
and increment equalent variables to==po in loop
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1344
while (len-- > 0) {
char c1 = ta[to++];
char c2 = pa[po++];
...
}
and use if(...) in while loop
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1349
if (ignoreCase) {
...
}
May be can create optimized regionMatches(...) for use in equalsIgnoreCase(...)?
More information about the core-libs-dev
mailing list