2009-06-03 5 views
14

Come tutti voi sapete, il codice Java è compilato e interpretato da JVM. Le mie domande riguardano l'ottimizzazione: È ottimizzata in fase di esecuzione solo dalla JVM o anche in fase di compilazione?Come scrivere codice Java efficiente?

Per scrivere codice efficiente, dove è possibile trovare l'elenco delle ottimizzazioni supportate? Oppure le ottimizzazioni JVM sono abbastanza potenti da dover scrivere codice che sia leggibile e di facile manutenzione indipendentemente dalle prestazioni di velocità?

risposta

30

La maggior parte dell'ottimizzazione viene eseguita dalla JVM. Di solito c'è più spazio per l'ottimizzazione a livello di JIT che in fase di compilazione. (Il flag "optimize" è stato effettivamente eliminato da javac, perché alcune ottimizzazioni hanno danneggiato le prestazioni nel mondo reale.)

In generale (e questo vale per molte lingue/piattaforme, non solo Java):

  • Codice di scrittura che sia il più leggibile e gestibile possibile.
  • avere obiettivi di performance e parametri di riferimento in modo da poter sempre misurare le prestazioni
  • sforzo messo in rendere il vostro architettura eseguire; è difficile cambiarlo più tardi (rispetto alla modifica dell'implementazione)
  • Pensa alle prestazioni più in termini di complessità degli algoritmi che "rendi il 10% più veloce": un passaggio da O (n^2) a O (n) è (generalmente) molto più importante. (Dipende molto da cosa sarà l'utilizzo del mondo reale - se si avranno solo piccoli valori di n, l'algoritmo "teoricamente migliore" può facilmente finire per essere più lento a causa di fattori costanti.)
  • Utilizzare un profiler per determinare dove i vostri colli di bottiglia sono
  • Solo micro-ottimizzare al costo di leggibilità quando il profiler suggerisce vale la pena fare
  • Misura dopo tale ottimizzazione - non si può avere effettivamente avuto un impatto molto, nel qual caso rollback
+2

Per la profilazione iniziale utilizzando Sun JVM, utilizzare "jvisualvm". È una versione standalone del profiler NetBeans che può essere allegata a un processo in esecuzione. –

+0

(C'è un plugin di avvio VisualVM per Eclipse.) –

4

Definirei sicuramente il codice di scrittura per la leggibilità e la gestibilità rispetto alle supposte ottimizzazioni.

L'ottimizzazione prematura è generalmente considerata una cosa negativa. http://en.wikipedia.org/wiki/Optimization_(computer_science)#When_to_optimize

Naturalmente, misurare e dimostrare i colli di bottiglia con gli strumenti di profilatura è un'altra cosa. Se lo fai e puoi provare che ci sono aree che necessitano di ottimizzazione e puoi quindi misurare i benefici andare avanti e ottimizzare via.

5

Il compilatore JIT Java HotSpot può rilevare "hotspot" e modificare in modo adattativo eseguendo il codice in modo che offra prestazioni migliori. Leggi su di esso here.

D'altra parte, se si desidera scrivere codice che sia efficace per iniziare, leggere un libro come "Hardcore Java" di Robert Simmons o "Java Concurrency in Practice" di Brian Goetz.

+0

È "Hardcore Java", non "Hardcode Java" – Kai

3

È ottimizzato in fase di esecuzione solo dalla JVM o anche in fase di compilazione?

compilatori Java in genere fanno molto poco ottimizzazione (a parte la risoluzione letterali compund), dal momento che bytecode "ottimizzata" può ostacolare la capacità del compilatore JIT per ottimizzare - ed è lì che è veramente importante.

O sono ottimizzazioni JVM potente abbastanza in modo che non mi resta che scrivere codice che è leggibile e facile da mantenere indipendentemente dalla velocità performance?

Non è una questione di fiducia in JVM per ottimizzare meglio di te (anche se questo è sicuramente un fattore), è una questione di ottimizzazione di essere del tutto irrilevante il 95% del tempo, dal momento che il codice non viene eseguito frequentemente. Se un pezzo di codice rappresenta lo 0,1% del tempo di esecuzione della tua app, semplicemente non vale la pena di preoccuparsene. Anche se puoi accelerarlo 100 volte, non ti guadagna nulla. E questo è il caso più comune.

Fintanto che si evitano cose incredibilmente stupide, è necessario dimenticare l'ottimizzazione finché non si verifica un problema prestazionale concreto, quindi solo ottimizzare esattamente le parti di codice che un profiler indica come punti caldi nel codice.

0

Non preoccuparti dell'ottimizzazione JVM specifica. Questi dettagli cambiano da versione a versione.

Acquista il libro "Java efficace" di Josh Bloch - questo è il miglior libro su questo argomento.

+0

Ehi, sdiz, piacere di vederti qui. :) – Bombe

1

Sebbene questi suggerimenti siano pensati per l'implementazione Java specifica di Google Android, suppongo che lo these Google Android performance tips si applichi anche nella JVM "normale". Si noti che Java di Android non ottimizza il codice in fase di esecuzione per quanto ne so.

-1

Cambiamenti di ottimizzazione JVM da versione a versione.