2010-09-30 5 views
7

Recentemente ho imbattuto in una classe che ha avuto il seguente campo dichiarato:differenze di prestazioni tra i campi primitivi finali statici e non statici in Java

private final int period = 1000; 

In questo caso particolare, l'autore aveva inteso per essere anche statico e dato che il valore non poteva essere modificato in alcun punto, non esisteva una vera ragione funzionale per non dichiararlo statico, ma mi chiedevo come Java tratta le primitive statiche finali e finali.

In particolare:

1) Come sono memorizzati primitive statici finali? Sono semplicemente compilati direttamente nelle espressioni in cui vengono utilizzati?

2) Se sono effettivamente allocati in memoria, ogni istanza della classe contenente deve mantenere un riferimento a tale posizione? (nel qual caso, per le primitive inferiori a 4 byte, ogni istanza della classe sarebbe effettivamente più grande di se includesse la primitiva direttamente come nel caso non statico)

3) I compilatori ora sono intelligenti abbastanza da determinare che in casi come quello sopra, la variabile è 'staticamente efficace' in quanto sarebbe impossibile avere istanze diverse contenenti valori diversi e quindi ottimizzarla in modo simile a una statica finale?

risposta

5

1) Come vengono memorizzate le primitive statiche finali? Sono semplicemente compilati direttamente nelle espressioni in cui vengono utilizzati?

Non compilato direttamente nelle espressioni. Sono compilati nel file .class e fanno riferimento all'opcode ldc.

2) Se sono effettivamente allocati in memoria, ogni istanza della classe contenente deve mantenere un riferimento a tale posizione? (Nel qual caso, per primitive di meno di 4 byte, ogni istanza della classe sarebbe effettivamente essere più grande se semplicemente incluso il primitivo direttamente come sarebbe nel caso non statica)

No, il " riferimento "viene inserito nel bytecode, quindi non è necessario memorizzare nulla per ogni istanza.

3) I compilatori ora sono abbastanza intelligenti da determinare che in casi come quello precedente, la variabile è "effettivamente statica" poiché sarebbe impossibile avere istanze diverse contenenti valori diversi e quindi ottimizzarla in modo simile a un finale statico?

Non sono sicuro, ma dubito che sia ottimizzato a livello di compilatore. Il JIT probabilmente entrerebbe in gioco. Tuttavia, non sono affatto sicuro del tipo di "differenze di rendimento" che ti aspetti. Non importa quale sia il caso, l'impatto sulla performance sarà trascurabile. (statico/non statico/finale/non finale)

+0

Re: # 3, in realtà non mi aspettavo realmente le differenze di prestazioni in termini di velocità, ma non sapevo se il mio ottimizzasse non memorizzandolo in base all'istanza i campi finali statici attuali. Con il senno di poi, la differenza di prestazioni è probabilmente un termine improprio. Grazie per il chiarimento – Dusty