Domanda

Sono interessato all'ottimizzazione in fase di esecuzione da parte di una VM e in fase di compilazione. Ho avuto l'idea che le ottimizzazioni siano più efficienti e facili al momento della compilazione.

Tuttavia, il mio pensiero sembra essere falso in determinate circostanze. Ciò è evidente nella Dichiarazione di Steve Yeggie citata da Daniel

  

La ptimizzazione [O] è spesso più semplice se eseguita in fase di esecuzione da un abile   macchina virtuale - -.

Perché l'ottimizzazione è più semplice se eseguita in fase di esecuzione da una macchina virtuale che in fase di compilazione?

È stato utile?

Soluzione

Risposta breve: poiché è più semplice identificare e analizzare in fase di esecuzione gli hotspot: le parti del programma che utilizzano più tempo.

Risposta lunga:

Se si avvia l'esecuzione del codice in modalità interpretata, una macchina virtuale può contare la frequenza e la durata di utilizzo delle diverse parti del codice. Queste parti possono essere ottimizzate meglio.

Accetta le clausole if-then-else-nidificate. Un minor numero di controlli booleani richiede un tempo di esecuzione minore. Se ottimizzi il percorso per la parte, che viene eseguita più spesso, puoi ottenere un runtime complessivo migliore.

Un altro punto è che in fase di esecuzione è possibile fare ipotesi impossibili in fase di compilazione. La Java-VM, ad esempio, si allinea ai metodi virtuali in modalità server - finché viene caricata solo una classe, che implementa questo metodo. Sarebbe pericoloso, se fatto in fase di compilazione. La JVM deoptimizza nuovamente il codice, se viene caricata un'altra classe, ma spesso ciò non accade mai.

Anche in fase di esecuzione è più noto il computer su cui è in esecuzione il programma. Se hai una macchina con più registri puoi usarli. Ancora una volta, ciò non è sicuro se eseguito in fase di compilazione.

Una cosa da dire: l'ottimizzazione in fase di esecuzione presenta anche degli svantaggi. Più importante: il tempo per le ottimizzazioni viene aggiunto al runtime del programma. Inoltre è più complicato, perché devi compilare parti del programma ed eseguirle. I bug nella macchina virtuale sono fondamentali. Pensa a un compilatore, che a volte si arresta in modo anomalo: puoi compilare di nuovo e tutto va bene. Se una VM si arresta in modo anomalo a volte, ciò significa che il programma a volte si arresta in modo anomalo. Non va bene.

In conclusione: puoi eseguire ogni ottimizzazione in fase di esecuzione, ciò è possibile in fase di compilazione ... e altro ancora. Hai ulteriori informazioni sul programma, i suoi percorsi di esecuzione e la macchina su cui è in esecuzione il programma. Ma devi considerare il tempo necessario per eseguire le ottimizzazioni. Inoltre è più complicato da eseguire in fase di esecuzione e gli errori sono più rilevanti che in fase di compilazione.

Altri suggerimenti

Perché ci sono più informazioni disponibili in fase di esecuzione. Ad esempio, sono noti la CPU, il sistema operativo e altri dettagli sull'ambiente esatti. Questa informazione ha un effetto su come dovrebbe essere eseguita l'ottimizzazione.

La VM ha il codice completo del programma e il compilatore ha spesso solo un codice parziale a causa della traduzione separata di diverse unità di traduzione. La VM ha quindi più dati per l'analisi.

Perché in fase di esecuzione hai ulteriori informazioni: come sta funzionando la macchina, i limiti della memoria del tuo processo e, probabilmente, soprattutto, quale codice viene eseguito e con quale frequenza.

Queste cose ti permettono di fare ottimizzazioni di runtime che semplicemente non puoi fare in fase di compilazione.

La VM può raccogliere statistiche per ottimizzare, come fa un database sul tuo utilizzo.

Il mantenimento continuo delle statistiche e il controllo degli invarianti sono anche spese generali per i tempi di esecuzione dei frammenti compilati o interpretati. Se non riesci a ottimizzare abbastanza velocemente e abbastanza bene, non preoccuparti. Non penso che sia più facile ottenere risultati migliori eseguendo il runtime invece del tempo di compilazione. Penso che sia ancora più difficile considerando la complessità di una buona attuazione.

Proprio come l'idea sbagliata comune di compilatori sufficientemente ottimizzati che generano un assemblaggio migliore rispetto agli umani, potrebbe essere necessario che una VM sufficientemente intelligente sia dannatamente troppo intelligente per eseguire più velocemente.

Qualcosa da riconoscere è che non è il concetto di VM che consente l'ottimizzazione del runtime, è il fatto che molte VM non eliminano i metadati del programma originale e hanno funzionalità integrate per la riflessione. Un termine più appropriato da usare sarebbe un & Quot; Libreria di runtime & Quot; può fare ottimizzazioni migliori delle sole ottimizzazioni statiche; questo vale per i linguaggi non VM come C.

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