Quando si compila il codice che opera su List <> oggetti, il compilatore deve utilizzare le chiamate di interfaccia, che si preoccupano più costoso di chiamate virtuali regolari sui tipi concreti.
Naturalmente, in un pezzo di codice in cui il compilatore vede l'oggetto che viene istanziato e può dimostrare che qualcosa che è dichiarato essere un elenco <> è sempre un ArrayList <>, il compilatore dovrebbe essere in grado di emettere solo un chiamata normale invece di una chiamata di interfaccia, ma i metodi che non sono in linea e funzionano su oggetti già istanziati non beneficerebbero di questa ottimizzazione.
L'ottimizzazione ubiquitaria che accelera le chiamate virtuali, ovvero le cache in linea (spesso la cache in linea polimerica o il PIC, da non confondere con il codice di posizione indipendente), trae vantaggio dall'osservazione che le istanze di una sola sottoclasse sono mai accessibili attraverso una variabile di un certo tipo dichiarato. In questo scenario, dopo che il codice è stato eseguito per un po ', il JIT può supporre ottimisticamente che un oggetto List <> sarà sempre solo un ArrayList <>, genererà una trappola nel caso in cui l'ipotesi fosse sbagliata e ricada con ArrayList <> chiamata.
I moderni processori eseguono il controllo molto rapidamente (perché sono superscalari e hanno una buona previsione di ramo) in modo da non notare il costo di tutte quelle chiamate virtuali e chiamate di interfaccia di implementazione singola. Ma rende la VM lavorare duro, strumentare, generare e applicare patch a tutto quel codice.
Per il software server in esecuzione in stato stazionario su HotSpot è irrilevante, ma per l'avvio veloce su un dispositivo mobile che potrebbe fare la differenza - non so quanto è buono VM di Google.
Un bel articolo su di esso dal dottor Cliff Click, Jr. (grande personalizzato ferro hardware, hotspot-deived VM): http://www.azulsystems.com/blog/cliff-click/2010-04-08-inline-caches-and-call-site-optimization
E naturalmente "inline caching" su wikipedia.
fonte
2010-10-20 14:49:18
"hai sempre imparato che è meglio creare un ArrayList utilizzando l'interfaccia Elenco". È interessante notare che non l'ho mai sentito prima. Qual è il vantaggio di farlo? –
@Brian se si utilizza l'interfaccia il più possibile il codice verrà disaccoppiato dall'implementazione dell'elenco. Rendendo più facile la sostituzione della lista con un altro oggetto che implementa solo l'interfaccia della lista. Come qualche strana astrazione di database o qualcos'altro. – Janusz
Quando gli esempi hanno sempre utilizzato le best practice? La maggior parte degli esempi MySQL/PHP sono pieni di attacchi SQL injection e altri problemi. La maggior parte degli esempi sul Web viene eseguita in modo tale da ottenere il massimo di funzionalità possibile dal meno codice possibile, o dal codice più semplice da comprendere possibile, ignorando completamente le best practice, i potenziali buchi di sicurezza e il controllo degli errori . – Kibbee