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.
fonte
2009-07-22 06:04:05
È * mono * tonicamente crescente di giorno in giorno :). Nessuna idea in termini assoluti. – akarnokd