2013-10-08 15 views
9

In questa discussione circa il sovraccarico delle prestazioni di utilizzo reflection, si afferma:Che tipo di ottimizzazioni runtime si perdono se usiamo riflessione

L'utilizzo di riflessione può causare alcune ottimizzazioni runtime da perdere. Ad esempio, il codice seguente è altamente probabile essere ottimizzata da una macchina virtuale Java:

int x = 1; 
x = 2; 
x = 3; 

codice equivalente usando Field.set *() non può.

Senza riflessione, che tipo di ottimizzazioni di runtime dovrebbero essere eseguite da JVM?

+0

Avrebbe semplicemente eseguito 'x = 3'. Tutti i tipi di trucchi in linea, eliminazione dell'opcode, ecc. Spariscono quando si riflette il mix. –

+0

Questa è una domanda interessante, ma penso che sia troppo ampia per una singola domanda SO. – chrylis

+0

I compiti a x non fanno nulla. È una variabile locale, nessuna multi-thread, nessuna concorrenza e può essere rimossa. Se si utilizza Field.set, l'altro thread potrebbe avere accesso alla variabile in modo che non possa mai essere ottimizzata. Questo è quello che penso. –

risposta

0

Non è possibile eseguire molte ottimizzazioni JIT. Basta guardare in fonte JDK, l'impostazione di un valore di campo tramite riflessione comporta controlli di sicurezza e alcune ricerche.

mentre il codice diretto sui valori primitivi come indicato dalla domanda viene associato a poche istruzioni di assemblaggio, le chiamate di riflessione forniscono all'ottimizzatore poche informazioni su ciò che sta accadendo, quindi poche ottimizzazioni possono essere fatte.

Se lo confrontate, scoprirete che il riflesso è un ordine di grandezza più lento rispetto al codice "diretto".

+1

Puoi approfondire la tua ultima riga? Come sei arrivato alla conclusione di "ordine di grandezza"? – Victor

+0

Reflection può essere quasi veloce come il codice diretto, a seconda di cosa si fa e come lo si fa. In particolare, i controlli di sicurezza e così via hanno solo un impatto sul primo accesso ... – assylias

+0

Basta testarlo. (1) esegui un riscaldamento decente (> 10000 iterazioni) in modo che il JIT entri in gioco. Evita errori di loop-in-place-jitting. –

3

In questo caso il codice può essere scartato in quanto non sembra fare nulla.

Se si utilizza la riflessione, sospetto che farebbe comunque qualcosa anche se non è possibile accedere a una variabile locale utilizzando la riflessione.

Problemi correlati