Java中的equalsIgnoreCase与RegionMatch。哪个是有效的?
我正在优化一段代码,它使用Java中的equalsIgnoreCase与RegionMatch。哪个是有效的?,java,string,string-comparison,Java,String,String Comparison,我正在优化一段代码,它使用equalsIgnoreCase处理数百万条记录。请任何人告诉我equalsIgnoreCase和regionMatches中哪一个在java中更快更高效。equalsIgnoreCase使用regionMatches(至少在OpenJDK中): 所以我想如果一个应该更快,它应该是regionMatches,但它肯定可以忽略不计。如果你检查equalsIgnoreCase的实现,它只依赖于regionMatches: public boolean equalsIgnor
equalsIgnoreCase
处理数百万条记录。请任何人告诉我equalsIgnoreCase
和regionMatches
中哪一个在java中更快更高效。equalsIgnoreCase
使用regionMatches
(至少在OpenJDK中):
所以我想如果一个应该更快,它应该是
regionMatches
,但它肯定可以忽略不计。如果你检查equalsIgnoreCase
的实现,它只依赖于regionMatches
:
public boolean equalsIgnoreCase(String anotherString) {
return (this == anotherString) ? true
: (anotherString != null)
&& (anotherString.value.length == value.length)
&& regionMatches(true, 0, anotherString, 0, value.length);
}
因此,如果不需要检查两个字符串的长度,您肯定知道它们引用的内存地址不相同,并且第二个字符串永远不会为空,regionMatches
的性能会稍好一些,因为您避免了数百万次的检查。然而,现实一点,您总是需要检查这一点,所以只需坚持equalsIgnoreCase
。差别太小了,即使有数百万个字符串,也无法注意到
public class EqualsVsMatch {
private static final int ROUNDS = 100000000;
private static final String SEARCH = "SEARCH";
private static final String SOURCE = "SOURCE";
public static void main(String[] args) {
long startRegionMatches = System.currentTimeMillis();
for(int i = 0; i < ROUNDS; i++) {
SOURCE.regionMatches(0, SEARCH, 0, 6);
}
long endRegionMatches = System.currentTimeMillis();
long startEqualsIgnoreCase = System.currentTimeMillis();
for(int i = 0; i < ROUNDS; i++) {
SOURCE.equalsIgnoreCase(SEARCH);
}
long endEqualsIgnoreCase = System.currentTimeMillis();
System.out.println("regionMatches: " + (endRegionMatches - startRegionMatches));
System.out.println("equalsIgnoreCase: " + (endEqualsIgnoreCase - startEqualsIgnoreCase));
}
}
所以就像前面提到的其他例子一样,equalsIgnoreCase只使用regionMatch。因此,我还建议您应该使用regionMatches。您可以尝试使用JMH对这两种方法的性能进行基准测试。我建议使用真实的数据集进行测试。是的。。现在就做。。看到了源代码。。感谢您的建议:-)我必须补充一点,我的示例依赖于这样一个事实:您检查数百万个不相等的字符串,否则equalsIgnoreCase可能会更快。基准测试并不是那么容易,需要考虑很多参数(JVM预热、编译器优化等)。有关更多详细信息,请参阅。此外,您的基准测试给出如此不同结果的主要原因是您忘记使用
regionMatches
,而ignoreCase
标志设置为true
:SOURCE.regionMatches(true,0,SEARCH,0,6)代码>。是的,你是对的。但是,如果您也使用SOURCE.regionMatches(true,0,SEARCH,0,6)尝试该示例;那么结果也很清楚。。
public class EqualsVsMatch {
private static final int ROUNDS = 100000000;
private static final String SEARCH = "SEARCH";
private static final String SOURCE = "SOURCE";
public static void main(String[] args) {
long startRegionMatches = System.currentTimeMillis();
for(int i = 0; i < ROUNDS; i++) {
SOURCE.regionMatches(0, SEARCH, 0, 6);
}
long endRegionMatches = System.currentTimeMillis();
long startEqualsIgnoreCase = System.currentTimeMillis();
for(int i = 0; i < ROUNDS; i++) {
SOURCE.equalsIgnoreCase(SEARCH);
}
long endEqualsIgnoreCase = System.currentTimeMillis();
System.out.println("regionMatches: " + (endRegionMatches - startRegionMatches));
System.out.println("equalsIgnoreCase: " + (endEqualsIgnoreCase - startEqualsIgnoreCase));
}
}
regionMatches: 5
equalsIgnoreCase: 1021