Differenza di velocità tra codice basato su VM e codice compilato [chiuso]

3

Non molto tempo fa mi è stato detto da un accademico anziano che, in questi giorni, il codice basato su VM poteva essere eseguito quasi velocemente come codice compilato, ma la mia esperienza è che il codice compilato esegue diversi ordini di tempo più velocemente.

Questo è basato sul tentativo del codice di fare la stessa cosa (elaborare un file XML di grandi dimensioni) - nel caso del codice basato su VM (Groovy) suppongo che il mio codice sarebbe completato in circa due anni (corretto) mentre il codice L'alternativa basata su C / C ++ ha richiesto circa tre ore.

Gli algoritmi non erano esattamente gli stessi - ma ciò era dovuto al fatto che l'uso di C / C ++ mi permetteva di manipolare la memoria a livello di byte usando i puntatori. Il codice di Groovy era più facile da scrivere in quanto la lingua era molto più espressiva, ma il prezzo pagato era l'esecuzione lenta.

Non pretendo di essere il più grande programmatore del mondo quindi accetterei volentieri che il mio codice possa essere migliorato: ma qual è la visione generale?

    
posta adrianmcmenamin 27.02.2014 - 11:00
fonte

2 risposte

4

In realtà, Google ha pubblicato un documento circa due anni fa a proposito questo argomento che descrive ciò che hai notato qui. I programmi C ++ consentono in genere più ottimizzazioni rispetto ai programmi scritti in linguaggi come Java / Scala / Go (o nel tuo caso Groovy), che offre maggiori opportunità per renderli più veloci, ma al prezzo di un maggiore sforzo di programmazione.

Detto questo, un fattore di velocità di > 5000 è per la mia esperienza molto insolita. Un fattore compreso tra 2 e 20 è quello che ho notato in passato (a seconda del problema e dell '"altro linguaggio" da confrontare con C ++). Un tale fattore indica che ci sono buone possibilità di ottimizzare il programma Groovy di almeno uno o due ordini di grandezza senza cambiare la lingua. www.stackoverflow.com potrebbe essere il luogo in cui discutere alcuni problemi di ottimizzazione (a condizione che tu sia disposto a pubblicare alcune parti del codice del tuo codice).

    
risposta data 27.02.2014 - 12:43
fonte
3

Le prestazioni di C, C ++ e Java sono paragonabili. Java a volte è anche più veloce, anche se di solito è un po ' più lento.

Tuttavia le lingue digitate dinamicamente (che Groovy è) sono più lente, perché devono cercare membri e metodi tutto il tempo mentre le lingue tipizzate staticamente possono farlo in anticipo e usare solo offset appropriati .

Naturalmente se lo stai rendendo ancora più lento utilizzando un algoritmo diverso che implica più copia, non stai più confrontando la velocità delle lingue. Ma alcuni algoritmi possono essere utilizzati solo in alcune lingue, che contano a loro vantaggio. Questo è principalmente il caso di tutto ciò che si basa sulla tipizzazione debole di C / C ++ in cui puoi prendere un pezzo di memoria e dire al compilatore di trattarlo come qualsiasi tipo tu voglia. Nessun linguaggio dinamico può farlo e la maggior parte dei linguaggi gestiti (come Java) non può farlo neanche.

Si noti che ciò si applica indipendentemente dal fatto che il linguaggio dinamico venga eseguito su una VM o compilato in codice nativo. La maggior parte dei linguaggi dinamici vengono eseguiti su macchine virtuali, ma ce ne sono anche di compilati e sono tutti più lenti di quelli tipizzati staticamente.

    
risposta data 27.02.2014 - 11:40
fonte

Leggi altre domande sui tag