Moje pytanie jest następujące:Czy wpisane tablice pomagają JIT w optymalizacji lepiej?
Jego zwykle dla kodu Java, że zbiory ogólne realizowane jak:
public class GenericCollection<T> {
private Object[] data;
public GenericCollection() {
// Backing array is a plain object array.
this.data = new Object[10];
}
@SuppressWarnings("unchecked")
public T get(int index) {
// And we just cast to appropriate type when needed.
return (T) this.data[index];
}
}
i używane tak na przykład:
for (MyObject obj : genericCollection) {
obj.myObjectMethod();
}
Od rodzajowe typu genericCollection jest wymazywany, JVM wydaje się nie mieć sposobu na stwierdzenie, że naprawdę wewnątrz "danych" tablicy genericCollection są tylko instancje MyObject, ponieważ rzeczywisty typ tablicy to Object, może być w niej String, a wywołanie "myObjectMethod" spowodowałoby wyjątek.
Zakładam więc, że JVM musi wykonać pewne ćwiczenia sprawdzające gimnastykę, aby wiedzieć, co naprawdę jest wewnątrz instancji GenericCollection.
Spójrzmy teraz na tej realizacji:
public class GenericCollection<T> {
private T[] data;
@SuppressWarnings("unchecked")
public GenericCollection (Class<T> type) {
// Create a type specific array.
this.data = (T[]) Array.newInstance(type, 10);
}
public T get (int index) {
// No unsafe casts needed.
return this.data[index];
}
}
W tym przypadku tworzymy specyficzny tablicę typu poprzez odbicie, więc JVM mogła wywnioskować nie może być być tylko obiekty T wewnątrz tej tablicy w danym kontekście, dzięki czemu niebezpieczne rzuty i możliwe drogie kontrole typu są zbędne.
Moje pytanie byłoby, biorąc pod uwagę rzeczy, które HotSpot może zrobić, czy pomogłoby to w jakikolwiek sposób, pod względem wydajności, zaimplementować ogólne kolekcje z "właściwą" specyficzną tablicą?
Na przykład, czy pomaga HotSpot w usuwaniu niepotrzebnych kontroli typów lub rzutów? Być może prawdopodobnie umożliwia to łatwiejsze metody inline, ponieważ wie, że tablica podkładu jest określonego typu?
hotspot JIT opiera się głównie na rodzajach zaobserwowanych przez profilowanie, a nie na informacji typu Java poziomu. Zatem tworzenie tablic wielu różnych typów może rzeczywiście tworzyć kod polimorficzny w niesklasyfikowanych ścieżkach kodowych. – the8472