Próbowałem utworzyć szybszą wersję metody String.equals() i zacząłem od jej skopiowania. Rezultat, który znalazłem, był dość zagmatwany. Kiedy uruchomiłem kopiowaną wersję, ustawiłem ją na czas i porównałem z wersją JVM, wersja JVM była szybsza. Różnica wahała się od 6x do 34x szybciej! Mówiąc krótko, im dłuższy ciąg, tym większa różnica.Dlaczego metoda String.equals() jest szybsza od niej samej?
boolean equals(final char a[], final char b[]) {
int n = a.length;
int i = 0;
while (n-- != 0) {
if (a[i] != b[i]) return false;
i++;
}
return true;
}
public static void main() throws Exception {
String a = "blah balh balh";
String b = "blah balh balb";
long me = 0, jvm = 0;
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
final char lhs[] = (char[]) value.get(a);
final char rhs[] = (char[]) value.get(b);
for (int i = 0; i < 100; i++) {
long t = System.nanoTime();
equals(lhs, rhs);
t = System.nanoTime() - t;
me += t;
}
for (int i = 0; i < 100; i++) {
long t = System.nanoTime();
a.equals(b);
t = System.nanoTime() - t;
jvm += t;
}
System.out.println("me = " + me);
System.out.println("jvm = " + jvm);
}
wyjściowa:
me = 258931
jvm = 14991
Metoda equals() Napisałem to kopia wklejony wersja znalezionego w String.equals() metody. Dlaczego wersja JVM jest szybsza niż w wersji wklejonej do kopiowania? Czy to nie jest faktycznie to samo?
Czy ktoś mógłby wyjaśnić, dlaczego widzę tak widoczne różnice?
PS: Jeśli chcesz zobaczyć duże różnice, możesz utworzyć długie (naprawdę, bardzo długie) łańcuchy z jedną postacią, różniącą się na końcu.
Po prostu zgadnij, ale myślę, że może to być związane z optymalizacją środowiska wykonawczego maszyny JVM. Natywna wersja jest prawdopodobnie używana wewnętrznie. Metody, które są często używane, są z większym prawdopodobieństwem optymalizowane przez maszynę wirtualną JVM. – Philipp
Myślę, że 'jvm' optymalizuje' String.equals' do równoważnej instrukcji asemblera na podstawie jego nazwy, a nie kodu. I prawdopodobnie również to podkreśla. Po skopiowaniu kodu utracone zostaną optymalizacje. – doublep
@Phillip: Też to zgadłem. Jeśli tak, to JVM traktuje swoje własne klasy specjalnie! –