Domanda

Sto scherzando un interprete giocattolo in Java e stavo pensando di provare a scrivere un semplice compilatore in grado di generare bytecode per Java Virtual Machine.Il che mi ha fatto pensare: quanta ottimizzazione deve essere eseguita dai compilatori destinati a macchine virtuali come JVM e CLI?

I compilatori Just In Time (JIT) eseguono piegature costanti, ottimizzazioni degli spioncini, ecc.?

È stato utile?

Soluzione

Aggiungerò solo due link che spiegano Il codice byte di Java abbastanza bene e alcuni dei varie ottimizzazioni della JVM durante il runtime.

Altri suggerimenti

L'ottimizzazione del bytecode è probabilmente un ossimoro nella maggior parte dei casi

Non penso che sia vero.Ottimizzazioni come il sollevamento degli invarianti del ciclo e la propagazione delle costanti non possono mai far male, anche se la JVM è abbastanza intelligente da eseguirle da sola, semplicemente facendo in modo che il codice faccia meno lavoro.

L'ottimizzazione è ciò che rende le JVM praticabili come ambienti per applicazioni a lunga esecuzione, puoi scommettere che SUN, IBM e amici stanno facendo del loro meglio per garantire che possano ottimizzare il tuo bytecode e il codice compilato JIT nel modo più efficiente possibile.

Detto questo, se pensi di poter pre-ottimizzare il tuo bytecode, probabilmente non farà molto danno.

Vale la pena essere consapevoli, tuttavia, che le JVM possono tendere a funzionare meglio (e non a bloccarsi) se presentate solo con il tipo di bytecode che il compilatore Java tende a costruire.Non è raro che le ottimizzazioni vengano perse o addirittura che la JVM si blocchi quando si verificano permutazioni del bytecode corrette ma diverse da quelle prodotte da javac.Si spera che questo genere di cose appartenga ormai al passato, ma potrebbe essere qualcosa di cui essere consapevoli.

Gli offuscatori come ProGuard eseguiranno molte ottimizzazioni statiche sul tuo bytecode per te.

Il compilatore HotSpot ottimizzerà il tuo codice in fase di esecuzione meglio di quanto sia possibile in fase di compilazione: dopo tutto ha più informazioni con cui lavorare.L'unico momento in cui dovresti ottimizzare il bytecode anziché solo il tuo algoritmo è quando ti rivolgi a dispositivi mobili, come Blackberry, dove la JVM per quella piattaforma non è abbastanza potente per ottimizzare il codice in fase di runtime e esegue semplicemente il bytecode.

L'ottimizzazione del bytecode è probabilmente un ossimoro nella maggior parte dei casi.A meno che tu non controlli la VM, non hai idea di cosa faccia per accelerare l'esecuzione del codice, se non altro.Il compilatore dovrebbe conoscere i dettagli della VM per generare codice ottimizzato.

Nota per Aseraphim:

Può anche essere utile ottimizzare il bytecode per applicazioni non integrate in alcuni casi limitati:

  1. Quando si distribuisce codice via cavo, ad esempio per le app WebStart, per ridurre al minimo le dimensioni del consegnabile/della cache e perché non si conosce necessariamente la capacità/velocità del client.

  2. Per il codice che sai essere critico per le prestazioni e utilizzato all'avvio prima (ad esempio) che HotSpot abbia avuto il tempo di raccogliere statistiche.

Ancora una volta, le trasformazioni eseguite da un buon ottimizzatore/offuscatore possono essere molto utili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top