Ottimizzazione Compilatore Java

Recentemente, stavo leggendo questo articolo.

Secondo tale articolo, il Compilatore Java cioè javac non esegue alcuna ottimizzazione, mentre la generazione del bytecode. È proprio vero? Se è così, allora può essere implementato come un codice intermedio generatore di rimuovere la ridondanza e generare ottimale di codice?

Non è esattamente un duplicato, ma la risposta potrebbe essere interessante: stackoverflow.com/questions/1680024/…
Beh, l’articolo è di quasi dieci anni. È ancora vero (non ho la pretesa di conoscere in ogni modo)? Mi consiglia di fare qualche ricerca utilizzando più moderne documenti.

OriginaleL’autore Mahesh Gupta | 2011-05-12

5 Replies
  1. 72

    javac solo fare un po ‘ di ottimizzazione, se qualsiasi.

    Il punto è che il compilatore JIT di più di ottimizzazione, e funziona meglio se si dispone di un sacco di informazioni, alcune delle quali potrebbero essere persi se javac eseguita l’ottimizzazione di troppo. Se javac eseguito una sorta di loop unrolling, sarebbe più difficile per il JIT per fare che, di per sé, in modo generale, e questo non ha ulteriori informazioni sulle ottimizzazioni saranno effettivamente lavoro, come si sa, la piattaforma di destinazione.

    -1 per la diffusione di Java mito che in fase di compilazione di ottimizzazione è indesiderabile. Alcune compilation passa può essere molto costoso, e non ha senso per diffondere l’idea che il JIT dovrebbe essere il compito di fare tutto il lavoro. Infatti, C e C++ ancora fare un lavoro migliore di Java quando si tratta di ottimizzazione.
    Che e ‘ la tua opinione, ma chiaramente non è condivisa da Java squadra di attuazione. javac non fare molto ottimizzazione poco se qualsiasi. E sì, alcune ottimizzazioni può essere costoso, che è il motivo per cui Hotspot fa progressivamente. E il fatto che lo fa con più informazioni sull’ambiente di destinazione (comprese le classi vengono caricati) permette di eseguire alcune ottimizzazioni che non può essere eseguita in modo statico. Ci sono alcune situazioni in cui AOT ottimizzazione funzionerà meglio, certo, ma è vero il contrario.
    Che esatto ottimizzazioni pensi che dovrebbe essere eseguita a tempo di compilazione, allora? Tenendo presente che questa uscita è per la classe di base, piuttosto che un intero binario. (Le differenze in termini di modello di esecuzione, unità di distribuzione ecc sono molto importanti.)
    Nella mia esperienza, il più efficace compilatore basato su ottimizzazioni in Java riguardano generico specializzazione, allineamento e di evitare operazioni di boxing. Per esempio, questa scala carta lampwww.epfl.ch/~dragos/file/scala-spec.pdf indica che l’esecuzione di specializzazione di funzioni ha portato a un 20x speedup, e la specializzazione delle matrici ha portato a 40x. Questo è un esempio per dimostrare che il JIT non è il santo graal, e che AOT può andare mano nella mano con il JIT.
    Non improvvisate, ho paura. Tenete a mente che il paesaggio per le prestazioni di Jvm modifiche per tutto il tempo – anche se in modo meno rispetto a prima.

    OriginaleL’autore Jon Skeet

  2. 25

    Ho smesso di leggere quando ho iniziato questa sezione:

    Più importante, il compilatore javac
    non eseguire semplici ottimizzazioni
    come il loop unrolling algebrica
    semplificazione, riduzione della forza,
    e per gli altri. Per ottenere questi benefici e
    altri semplici ottimizzazioni, il
    programmatore deve eseguire nel
    Codice sorgente Java e non fare affidamento su
    compilatore javac.

    In primo luogo, fare il loop unrolling sul codice sorgente Java è quasi mai una buona idea. Il motivo javac non fare molto in termini di ottimizzazione è che è fatto dal compilatore JIT per la JVM, che può fare molto meglio le decisioni che il compilatore potrebbe, perché è in grado di vedere esattamente che codice è sempre gestito la maggior parte.

    OriginaleL’autore Simon Nickerson

  3. 14

    Il javac compilatore, una volta sostenuto l’opzione per generare bytecode ottimizzato passando -o sulla riga di comando.

    Tuttavia a partire J2SE1.3, l’HotSpot JVM è stato fornito con la piattaforma, che ha introdotto tecniche dinamiche quali il just-in-time compilazione e l’ottimizzazione adattiva di comuni percorsi di esecuzione. Da qui la -o è stato ignorato dal compilatore Java a partire da questa versione.

    Mi sono imbattuto in questo flag durante la lettura Ant javac attività e la sua optimize attributo:

    Indica se la sorgente deve essere compilato con l’ottimizzazione; il valore predefinito è off. Nota che questo flag è semplicemente ignorati dal Sole javac a partire con il JDK 1.3 (dato in fase di compilazione di ottimizzazione è necessaria).

    I vantaggi dell’HotSpot JVM dinamica ottimizzazioni oltre a compile-time di ottimizzazione sono menzionati in questa pagina:

    La VM Server contiene avanzati adaptive compilatore che supporta molti degli stessi tipi di ottimizzazioni eseguite dal ottimizzazione dei compilatori C++, così come alcune ottimizzazioni che non può essere fatto dai tradizionali compilatori, come aggressive inline virtuale attraverso le invocazioni del metodo. Questo è un competitivo e il vantaggio di prestazioni rispetto statico compilatori. Ottimizzazione adattiva tecnologia è molto flessibile nel suo approccio, e in genere supera, anche avanzate, analisi statica e tecniche di compilazione.

    OriginaleL’autore manouti

  4. 8

    Ho studiato riprodotto il bytecode Java in passato (utilizzando una app che si chiama FrontEnd). Sostanzialmente non fa alcuna ottimizzazione, tranne che per l’inlining costanti (statico finale) e precalculating fisso espressioni (come 2*5 e “ab”+”cd”). Questo è parte del motivo per cui è così facile da smontare (utilizzando l’app JAD)

    Ho anche scoperto alcuni punti interessanti per ottimizzare il codice java. Mi ha aiutato a migliorare la velocità di inner-loop di 2,5 volte.

    Un metodo 5 di accesso rapido variabili. Quando queste variabili sono chiamati, sono più veloce di tutte le altre variabili (probabilmente a causa di stack di manutenzione). I parametri di un metodo sono contati anche per questi 5. Quindi, se si dispone di codice all’interno per il ciclo che viene eseguito come un milione di volte, allocare le variabili all’inizio del metodo, e non hanno parametri.

    Variabili locali sono anche più veloce di campi, quindi se si utilizzano campi all’interno di cicli interni, cache di queste variabili, assegnando una variabile locale all’inizio del metodo. La Cache di riferimento e non il contenuto. (esempio: int[] px = questo.pixel;)

    Espressione costante manipolazione (che comprende finale variabili – non è necessario statico, se hanno un valore costante) è effettivamente prescritti dalla specifica del linguaggio.
    Si può fornire ulteriori informazioni su questi “5 di accesso rapido variabili”? Sono consapevole del aload_<n> byte di codice di istruzioni, ma ci sono solo 4 di loro, da 0 a 3 (lo stesso per astore_<n>). Io non sono nemmeno sicuro se eseguire misurabili migliore rispetto al normale aload operazione (ad eccezione che non hanno bisogno di extra indice di byte, in modo sicuro, un po ‘ di spazio). Sono d’accordo con le “variabili locali contro i campi” argomento, però.

    OriginaleL’autore Zom-B

  5. 0

    Per ottimizzare il bytecode, è possibile utilizzare Proguard.

    Come altri hanno notato, il JIT in un mainstream JVM per ottimizzare il codice, come si compila e si ha accesso a più di contesto, probabilmente outperform Proguard. Questo potrebbe non essere il caso più semplice VMs. Nel mondo Android è pratica comune utilizzare Proguard ottimizzazioni quando il targeting Dalvik (VM che è venuto con Android prima di lecca-lecca).

    Proguard, inoltre, si restringe e di offuscare il bytecode, che è un must quando la spedizione del lato client di applicazioni (anche se non uso le ottimizzazioni).

    OriginaleL’autore Samuel Peter

Lascia un commento