2012-11-29 11 views
7

Si consideri il seguente metodo:Le definizioni delle variabili sono utilizzate una volta ottimizzate?

private static long maskAndNegate(long l) { 
    int numberOfLeadingZeros = Long.numberOfLeadingZeros(l) 
    long mask = CustomBitSet.masks[numberOfLeadingZeros]; 
    long result = (~l) & mask; 
    return result; 
} 

Il metodo può essere abbreviato a:

private static long maskAndNegate(long l) { 
    return (~l) & CustomBitSet.masks[Long.numberOfLeadingZeros(l)]; 
} 

sono questi due rappresentazioni uguali in fase di esecuzione reale? In altre parole, il compilatore Java ottimizza la definizione non necessaria di variabili extra, che ho posto per la leggibilità e il debugging?

+0

Quale compilatore Java? Quale compilatore JIT? Quale piattaforma? In altre parole, l'unico modo affidabile per ottenere una risposta pertinente a * te * è provarlo tu stesso. Non è così difficile. – NPE

+0

"il compiler Java ottimizza ..." nella maggior parte dei casi, il compilatore non ottimizza mai le cose, iirc. la tecnologia HotSpot può ottimizzarlo ed è probabilmente quello che dovresti ricercare. –

+0

Esistono alcune ottimizzazioni eseguite dalla maggior parte, se non da tutti, dai compilatori Java. Prenderò qualsiasi ottimizzazione eseguita da Oracle, GNU (e forse Eclipse) come standard. http://en.wikipedia.org/wiki/Java_compiler#Major_Java_compilers –

risposta

11

Il compilatore Java non esegue praticamente alcuna ottimizzazione. È il JIT che fa quasi tutto.

Le variabili locali sono alquanto irrilevanti per l'ottimizzazione, tuttavia un'espressione multioperatore richiede ancora i vari operandi logicamente per andare in pila, solo in "slot" senza nome. Potresti scoprire che il codice byte generato per le tue due implementazioni è molto simile, solo senza i nomi nel secondo caso.

Ancora più importante, nessun beneficio di prestazioni che potrebbero verificano molto occasionalmente dalla riduzione del numero di variabili locali si utilizza è quasi certamente sarà insignificante. Il vantaggio di leggibilità del primo metodo è molto più probabile che sia significativo. Come sempre, evita la micro-ottimizzazione senza aver prima provato che il posto che stai cercando di ottimizzare è un collo di bottiglia, e quindi concedi solo ottimizzazioni che hanno lo stesso valore .

(Con il tempo che hai hai dimostrato necessità per ottimizzare un particolare metodo, avrete già gli strumenti per testare qualsiasi potenziale di ottimizzazione, quindi non sarà necessario indovinare.)

+0

Grazie mille per la risposta. Stavo chiedendo per curiosità: preferisco sempre la leggibilità rispetto ad un'ottimizzazione prematura. –

0

Il il codice non è abbastanza grande da essere ottimizzato per i principianti. E nel secondo modo stai solo salvando la memoria utilizzata per memorizzare i riferimenti a numberOfLeadingZeros e tutti.

Ma quando si utilizza questo codice in modo sufficientemente significativo in runtime, ad esempio almeno 10000 volte, JIT lo identificherà come codice HOT e quindi lo ottimizzerà con trucchi accurati come Method Inlining e tipi simili.

Ma nel tuo caso un'opzione preferibile è primo in quanto è più leggibile .

Non si dovrebbe compromettere la leggibilità per piccole ottimizzazioni.

Problemi correlati