In che modo le prestazioni .NET / Mono si confrontano con JVM?
-
05-07-2019 - |
Domanda
Me lo sto chiedendo da un po '. Fornisci dati quantitativi a supporto della tua risposta.
Correlati: esiste una differenza significativa tra le prestazioni JVM di Windows, Mac e Linux?
Soluzione
Shudo ha fatto confronti e rilascia codice sorgente per microbenchmark come linpack, Scimark, ecc. .
Risultati di esempio per linpack:
(fonte: shudo.net )
Ma l'ultimo aggiornamento è stato effettuato oltre 5 anni fa, apparentemente usando .NET V1.0 o v1.1 e usando principalmente JVM v1.4. Ciò significa che sono diverse le versioni non aggiornate su Java e .NET. Potresti ottenere la fonte e generare i tuoi risultati.
Ho appena fatto questo: scaricato linpack.java e linpack.cs, compilato ed eseguito. Ho usato Java v1.6.0.11 di Sun e C # 3.0 (compilatore 3.5) di Microsoft. Entrambi su Windows Vista.
Per una dimensione del problema di Linpack di 2000, ho ottenuto 17.6s per la versione Java, 17.78s per la versione C #.
Quindi l'ho eseguito di nuovo e ho ottenuto 18.14s per Java e 17.31 per C #.
Cosa stai misurando?
Questo illustra alcune sfide nella misurazione e nel test delle prestazioni.
-
In primo luogo:
una sola prova non è sufficiente per trarre conclusioni significative. Di solito dovresti misurare molte prove e quindi fare una media dei risultati. -
Secondo:
cosa stai misurando? Se si esegue una singola prova per risolvere un singolo problema, i costi di avvio del processo sono inclusi nel tempo, nonché nel tempo JIT e qualsiasi costo per riempire eventuali buffer. Questo potrebbe essere o meno ciò che vuoi davvero misurare.In molti casi è la perf dello stato stazionario che si desidera misurare. Ad esempio in un processo server, lo si avvia una volta e viene eseguito per mesi. Pertanto, il costo di avvio è trascurabile e ciò che si desidera misurare e ottimizzare è il throughput della richiesta, dato un tempo di risposta medio minimo. O in un "Fat Client", quello che vuoi è il tempo necessario per eseguire l'elaborazione video e non vuoi misurare i costi di avvio del processo.
-
Terzo:
qual è il carico di lavoro? Linpack e Scimark potrebbero essere interessanti se fai molta matematica in virgola mobile. E se non lo facessi? Che cosa succede se si esegue un sacco di triturazione XML, analisi delle stringhe, matematica di numeri interi, interazione con il database o generazione di pagine HTML. Che cosa succede se il codice esegue molta gestione dei thread o utilizza primitive di sincronizzazione dei thread? Che dire di comunicazioni e IO? Cosa succede se una parte chiave di una transazione è la crittografia o la creazione e la verifica della firma digitale? Questi benchmark non ti diranno nulla di quegli altri scenari. Per questo motivo potresti chiamarli micro-benchmark.È necessario un benchmark che modelli correttamente ciò che si desidera valutare.
Vedi anche:
Problemi matematici di base come benchmark linguistici
Altri suggerimenti
Dai un'occhiata a The Computer Language Shootout . Confrontano numerose lingue e macchine virtuali, tra cui Mono e JVM .
se stai osservando la velocità di avvio, la memoria e l'utilizzo della CPU sui desktop, questo potrebbe essere utile poiché utilizza le ultime versioni a partire da luglio 2010