2009-07-19 10 views
9

Il Web è pieno di diversi tipi di test delle prestazioni di lingue diverse, compilatori e macchine virtuali. Eppure quasi nessuno di questi test le prestazioni utilizzando uno scenario del mondo reale. Inoltre, la ricerca di Google per questo tipo di benchmark di solito produce solo alcuni benchmark di diversi anni, poiché quelli hanno avuto il maggior tempo per raccogliere link a loro.Come sono le prestazioni correnti della macchina virtuale Mono?

Qualcuno di voi ha qualche informazione reale sulle prestazioni attuali di diverse macchine virtuali? Inoltre mi piacerebbe soprattutto sapere come le prestazioni di Mono siano comparabili a quelle di Microsoft .Net e Sun's Java e come le prestazioni di diverse macchine virtuali si siano evolute ultimamente.

+2

È * mono * tonicamente crescente di giorno in giorno :). Nessuna idea in termini assoluti. – akarnokd

risposta

2

Per un confronto di Java e Mono è possibile dare un'occhiata a The Computer Language Benchmarks Game.

+0

Non vedo alcun segno della VM di .NET effettiva in tale elenco? –

+0

Dato che non funzionerà su Linux. Ma è per questo che ho limitato la mia risposta a Mono e Java. – Joey

1

Mentre non ho usato Mono, immagino dipenda da cosa si fa con esso. Non posso dare numeri esatti sulle cose, ma qui è un bocconcino interessante circa le prestazioni in virgola mobile di Mono:

http://forums.xna.com/forums/p/24249/24249.aspx

Come Mono permette l'uso di istruzioni SIMD della CPU (SSE2 e SSE4 in questo momento, ho credi) per accelerare drasticamente i calcoli in virgola mobile, può spazzare via .NET in questo tipo di cose (fino a 10 volte più veloci), come mostra il grafico (e spero che Microsoft implementerà presto qualcosa simile, .NET 4.5, per favore?). Tuttavia, il grafico mostra anche che .NET è ancora significativamente più veloce di Mono quando non si utilizza Mono.Simd. E tu potresti fare un enorme salto di fiducia e estrapolare quella differenza del 20% in prestazioni in virgola mobile in altre aree, come le prestazioni delle stringhe.

Tuttavia, questo è Mono 2.2 e le cose potrebbero essere cambiate drasticamente mentre Mono si sta muovendo abbastanza velocemente in questi giorni, o almeno così sento.

+0

Perché il downvote se posso chiedere? – JulianR

+0

Le prestazioni di Mono sono orribili e sono migliorate solo marginalmente e una volta nella sua intera vita (con Mono 2.2). –

12

La misurazione delle prestazioni è una questione complicata. In passato, quando le lingue venivano testate sullo stesso sistema operativo, con lo stesso hardware e un set di librerie molto limitato, era possibile creare benchmark in grado di fornire una metrica lineare che misurasse un sistema. Permetterebbe alla gente di valutare le cose da zero a dieci, assimilare il risultato e passare rapidamente al soggetto successivo.

Le cose sono diventate più complicate con i sistemi moderni in quanto vi sono più variabili da tenere in considerazione.

Almeno nel caso di Mono ci sono un sacco di variabili che entrano in gioco:

  • Codice:

    • La qualità del codice nativo generato.
    • La velocità con cui viene generato il codice nativo.
    • La memoria richiesta per generare il codice e per ottimizzare il codice
    • è il generatore di codice multi-threaded
    • è il codice generato thread-safe
    • Ci vuole sfruttare le funzionalità specifiche della CPU, al momento della compilazione o tempo JIT.
    • Può utilizzare le istruzioni SIMD se disponibili.
    • La lingua si mappa ordinatamente su piattaforme multi-core
    • Il linguaggio fornisce parametri sufficienti per un ottimizzatore per ottimizzare automaticamente il codice (come fa Fortran).
  • gestione della memoria:

    • L'algoritmo di garbage collection utilizzato
    • Fa la scala GC con più CPU?
    • Il GC è incrementale o in tempo reale?
    • Supporta storage thread-local per prestazioni migliorate?
    • È preciso, compattante, generazionale, conservatore e quali mix di ciascuno.
  • API disegno:

    • Sono le API progettate per la latenza o la larghezza di banda
    • Do API supporto automaticamente di scala a più CPU.
    • È possibile scaricare lavori pesanti su una GPU?
    • fare la tua API supportano le interfacce di streaming

Tutte queste cose questioni complicare molto e fare un semplice 0-10 risposta molto difficile da dare.

Se si dovesse partizionare lingue nelle classi, e si assume un programmatore a conoscenza competente e prestazioni, vorrei dividere il mondo in queste classi:

  • Tier 1: sintonizzati mano linguaggio assembly da un professionista
  • Livello 2: staticamente compilati, linguaggi fortemente tipizzati: C/C++/Fortran/
  • di 3 ° livello: gestito lingue/JIT:. Java/C#/NET/Mono/Boo/F #
  • Tier 4: digitato in modo dinamico/JITed lingue: Google V8, IronPython, IronRuby
  • Livello 5: puro linguaggio interpretato: Python, Perl
  • Livello 6: lingue interpretate pure, con troppe funzioni per il loro bene.

Ma le lingue non dipingono un intero quadro, le API che si consumeranno, il sistema operativo di hosting e altre strutture avranno un grande impatto sui risultati.

Ad esempio, recentemente in Mono abbiamo aggiunto il supporto per la sostituzione del motore di codice gen di Mono con un motore più avanzato e altamente ottimizzante (il motore LLVM). Risulta che è stato incredibilmente difficile trovare un test in cui il sovraccarico dell'utilizzo di LLVM valesse l'uso extra della memoria: le applicazioni desktop e web non mostravano molta differenza. E questo è probabilmente dovuto al fatto che si tratta principalmente di applicazioni con I/O.

L'utilizzo di LLVM è stato utile per applicazioni scientifiche e ad uso intensivo di calcolo, ma nella vita reale non ha fatto molta differenza dalle impostazioni di ottimizzazione predefinite di Mono.

Per quanto riguarda le specifiche di Mono: sebbene Mono utilizzi il GC di Boehm, ciò che molti non si rendono conto è che Boehm può essere configurato in vari modi. La configurazione di default del laico non è davvero molto potente, ma funziona per tutti coloro che vogliono un GC veloce. Mono non usa Boehm in questa modalità, Mono configura Boehm in modo estensivo per lavorare in modalità precisa e approfitta della memorizzazione locale dei thread, del GC multi-core e delle modalità di rilascio-memoria-OS.

+2

Grazie Miguel, ma quello che non hai osato era di fornire misurazioni delle prestazioni nel mondo reale. Ciò che sarebbe particolarmente interessante sarebbe la performance di asp.net mvc su mono contro ruby ​​su rails/cakephp/etc. in esecuzione sullo stesso server. – lhahne

+1

Devi sapere cosa stai testando. Se si hanno due applicazioni simili, una in Mono con ASP.NET MVC e una con rails/cakephp, posso provarle e riportare i risultati. Se il codice è intensivo dal punto di vista computazionale, allora Mono sarà più veloce, semplicemente perché ha un JIT per un sistema fortemente tipizzato. Se il codice è legato all'IO, dipenderà davvero da come è stato scritto il codice. –

0

So che questo è vecchio, ma ho appena trovato e nessuna delle risposte attuali (anche di Miguel) risolve un difetto fondamentale nella tua domanda: una macchina virtuale.

Sembra che tu sia stato male informato su questo punto. .Net non usa una VM, e nemmeno mono. È vero che .Net utilizza una libreria di runtime e il codice viene compilato su IL per la distribuzione simile al bytecode di Java. Tuttavia, un runtime non è una macchina virtuale. La differenza è che dopo la distribuzione l'IL è a sua volta compilato completamente al codice macchina nativo prima dell'esecuzione. Non è necessario applicare alcuna macchina virtuale.

1

I benchmarked Mono 2.0 e 2.2 all'inizio di quest'anno utilizzando SciMark2 e trovato che le prestazioni di Mono erano leggermente aumentate ma è ancora molto più lento rispetto alla maggior parte delle altre VM.

Problemi correlati