2011-01-27 21 views
6

Giochi di sviluppo per dispositivi Android, ho bisogno di indirizzare dispositivi che non hanno alcun JIT e fanno affidamento solo su ottimizzazioni bytecode. Mi chiedo se il set di queste ottimizzazioni sia vuoto o no ...Ottimizzazioni Java: solo bytecode vs JIT

In realtà, il compilatore java (quello duro, javac, non un JIT) rende l'ottimizzazione come trasformare un/4 in un >> 2? O ogni ottimizzazione è un lavoro per il JIT?

+0

La divisione rispetto allo spostamento a sinistra non ha alcun effetto sulla velocità complessiva del programma. Non il minimo bit. – delnan

risposta

7

Il compilatore Java standard esegue alcune ottimizzazioni, ma lascia la maggior parte di esse al JIT.

Il JIT sa su quale processore esattamente il programma è in esecuzione e ha anche accesso alle informazioni di runtime, e quindi può fare più ottimizzazioni di quelle che il compilatore Java potrebbe fare in anticipo. Inoltre, fare in anticipo ampie ottimizzazioni potrebbe "offuscare" un po 'il codice byte, rendendo più difficile per il JIT ottimizzarlo.

Non so cosa fa il compilatore di Google quando traduce il codice byte Java nel codice Dalvik - potrebbe essere una ottimizzazione più ampia.

Forse questo strumento sarà utile per voi: Dalvik Optimization and Verification With dexopt

A proposito, l'esempio si parla non è sempre valida; la trasformazione di a/4 in a >> 2 non garantisce il funzionamento del programma più veloce su qualsiasi processore. Ho letto un articolo da qualche parte una volta (scusa, non riesco a trovarlo in questo momento ...) che ha spiegato che su (penso) i moderni processori x86, a >> 2 potrebbe anche essere più lento di a/4.

In ogni caso, non fare ottimizzazioni premature come trasformare a/4 in a >> 2 a mano nel codice sorgente a meno che non si abbiano prove reali (da misurazioni di prestazioni) che valga la pena farlo.

+0

Grazie (entrambi). In realtà non sto facendo alcuna micro-ottimizzazione, mi piace la facile leggibilità, ma mi chiedevo solo se i dispositivi senza JIT avrebbero sofferto di ogni possibile peccato o se le ottimizzazioni triviali fossero state fatte dal compilatore. Come hai detto, il mio esempio non è così banale ... è stato cattivo. –

2

Se la tua piattaforma di esecuzione sta eseguendo in realtà bytecodes, è probabile che le intuizioni su cose come a/4 siano più veloci di a >> 2. Hai bisogno di fare qualche seria profiling applicazione di capire:

  • se si tratta di ottimizzazione pena a tutti,
  • dove concentrare i vostri sforzi, e
  • quello (micro) ottimizzazioni effettivamente lavoro.

FWIW, è improbabile che il compilatore javac tenti di ottimizzare l'aritmetica. Il codice nativo ottimale dipende dall'hardware della piattaforma di esecuzione effettiva e se javac ha tentato di ottimizzare i bytecode è probabile che renderebbe più difficile l'attività del compilatore JIT.