Ma question est la suivante:Les tableaux typés aident-ils le JIT à optimiser son fonctionnement?
Son habitude pour le code Java pour avoir des collections génériques mis en œuvre comme:
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];
}
}
Et utilisé comme celui-ci par exemple:
for (MyObject obj : genericCollection) {
obj.myObjectMethod();
}
Comme le type générique de genericCollection est effacé, la JVM ne semble pas avoir un moyen de savoir que vraiment dans le tableau 'data' de genericCollection il n'y a que des instances MyObject, puisque le type réel du tableau est Object, il peut y avoir un String, et appeler 'myObjectMethod' dessus soulèverait une exception.
Donc, je suppose que la JVM doit faire de la gymnastique de vérification de l'exécution pour savoir ce qu'il y a vraiment dans cette instance de GenericCollection.
Regardez maintenant cette implémentation:
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];
}
}
Dans ce cas, nous créons un type matrice spécifique par la réflexion, de sorte que la machine virtuelle Java pourrait en déduire qu'il pourrait y avoir être seulement des objets T se trouvant dans ce tableau dans un contexte donné, ce qui les moulages dangereux et les chèques de type coûteux éventuels redondants. Ma question serait, étant donné les possibilités offertes par HotSpot, de mettre en œuvre, de quelque façon que ce soit, des implémentations de génériques avec une matrice de sauvegarde spécifique de type «appropriée»?
Par exemple, aide-t-il HotSpot à supprimer les vérifications de type ou les conversions inutiles? Peut-être peut-être l'activer pour des méthodes en ligne plus facilement étant donné qu'il sait que le tableau de support est d'un type spécifique?
JIT est principalement basée sur les types observés par profilage et non sur des informations de type de niveau java. Ainsi, la création de tableaux de nombreux types différents pourrait en fait créer du code polymorphe dans des chemins de code non-alignés. – the8472