2011-12-26 2 views
7

la mia domanda è molto semplice:Probabilità di getter e setter sempre inline dal compilatore

D: Qual è la probabilità che un metodo getter/setter otterrà inline dal compilatore in Java?
(Ovviamente non c'è una risposta definitiva a questa, ma altre informazioni sarebbe apprezzato)

Extra: Capisco che ci sia sempre una possibilità che il compilatore (Standard e JIT) decideranno di fare un metodo in linea, e quando si tratta di getter e setter questo è solitamente ciò che vuole il programmatore.

Grazie in anticipo.

+2

C1 o C2 (vale a dire client o server)? Ma in entrambi i casi estremamente alto, quindi puoi assumerlo finché il codice è "caldo". Se vuoi provarlo, usa -XX: ++ PrintAssembly per controllare il codice generato. L'unico problema sarebbe la definizione di "budget" che è più limitato sul compilatore C1. – bestsss

risposta

3

Il compilatore (javac) tende ad avere un impatto trascurabile sull'ottimizzazione, poiché l'ottimizzazione avviene in fase di esecuzione.

Alla JIT sì, probabilmente in linea sia prima o later.depending da quanto venga utilizzato il codice, quindi una chiamata di funzione può essere visto in un primo momento, ma quando il getter/setter è stato chiamato sufficientemente spesso allora è in linea.

+0

javac ha un periodo difficile di inlining perché vogliamo ancora una traccia di stack valida in qualsiasi momento. Ma allora perché preoccuparsi della chiamata di un metodo che viene chiamato solo poche centinaia di volte? C2 ha un budget in linea abbastanza grande che in pratica significa che un getter/setter sarà sempre in linea comunque. C1 potrebbe essere più limitato a tale riguardo però. – Voo

+0

vero. Stavo cercando di affrontare la questione della probabilità che fossero in linea. – Shaunak

+1

javac potrebbe non essere affatto in linea – bestsss

2

Immagino di zero (almeno nel caso non JIT), poiché si tratta di convenzioni Java Bean e devono sempre essere pubbliche, quindi il compilatore non può prevedere chi potrebbe chiamare i metodi. È possibile modificare l'implementazione di uno di questi che interromperebbe un chiamante in linea. Non c'è nulla da richiedere che debbano essere implementati solo per impostare un campo.

2

Il compilatore può essere in linea quando un metodo è final ei campi a cui si accede sono accessibili al chiamante. Quindi spetta al compilatore determinare se il metodo è "semplice" abbastanza per l'inlining.

In pratica, l'impostazione o la ricezione di un campo è generalmente considerata abbastanza semplice, quindi una accessoria finale per un campo accessibile sarà in linea. Gli accessori per i campi privati ​​saranno incorporati nella loro classe dichiarante; le funzioni di accesso per i campi protetti saranno integrate in tutto il pacchetto di dichiarazione e tutte le classi derivate; & c.

In fase di esecuzione, è probabile che il JIT esegua ulteriori inlining in base all'analisi del codice in esecuzione.

+0

La quantità di volte in cui un getter/setter influisce sul probabile che la JIT considererà in linea? Esiste qualcosa di simile alla parola chiave 'inline' (C++) in Java, che consiglia di inserire un metodo? – Acidic

+0

Sì, l'utilizzo è un fattore per JIT in fase di esecuzione. Ma non c'è alcun suggerimento in linea esplicito che tu possa dare al compilatore. – erickson

+0

Grazie. Devo averlo perso la prima volta - cosa intendevi per "accessorio finale"? – Acidic