La mia domanda è la seguente:Gli array digitati aiutano il JIT a ottimizzare meglio?
la consueta per il codice Java per aver collezioni generiche implementato come:
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];
}
}
e utilizzato in questo modo, per esempio:
for (MyObject obj : genericCollection) {
obj.myObjectMethod();
}
Dal momento che il tipo generico di genericCollection viene cancellato, la JVM non sembra avere un modo per sapere che veramente all'interno dell'array 'data' di genericCollection ci sono solo istanze MyObject, dal momento che il tipo effettivo dell'array è Object, potrebbe esserci una String in esso, e chiamando "myObjectMethod" su di esso si alzava un'eccezione.
Quindi presumo che JVM debba eseguire alcuni esercizi di ginnastica di controllo runtime per sapere cosa c'è realmente all'interno dell'istanza di GenericCollection.
Ora controllare questa implementazione:
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];
}
}
In questo caso è stata creata una matrice di tipo specifico attraverso la riflessione, in modo JVM potrebbe dedurre ci potrebbe essere solo essere oggetti T all'interno di tale matrice in un dato contesto, rendendo i cast pericolosi e le costose verifiche di tipo ridondanti.
La mia domanda sarebbe, date le cose che HotSpot può fare, sarebbe di aiuto in ogni modo, per quanto riguarda le prestazioni, implementare collezioni generiche con un array di backup specifico di tipo "corretto"?
Ad esempio, aiuta HotSpot a rimuovere controlli o cast di tipo non necessari? Forse lo si può abilitare a metodi inline più facilmente, dato che sa che l'array di supporto è di un tipo specifico?
hotspot JIT si basa soprattutto sui tipi osservati da profilatura e non su informazioni di tipo a livello di java. Quindi la creazione di array di molti tipi diversi potrebbe effettivamente creare codice polimorfico in percorsi di codice non in linea – the8472