2010-08-02 10 views
16

Secondo le informazioni che ho potuto raccogliere in ambiente di esecuzione NET e Java, la situazione attuale è segue:.NET runtime vs. Java Hotspot: .NET è una generazione indietro?

Benchmark a parte e con nessuna intenzione di intensificare guerre sante, questo significa che Java Hotspot VM è una generazione avanti di .Net. Queste tecnologie utilizzate in Java VM potranno finalmente trovare la sua strada in .NET runtime?

+11

L'articolo collegato suggerisce che la ricompilazione dinamica potrebbe essere una buona cosa, ma che è difficile sapere con certezza, dal momento che la VM può scegliere di ri-ottimizzare senza preavviso. Senza una profilazione sensibile del codice, sembra un articolo di fede, poiché non vi è alcuna prova che "grandi miglioramenti delle prestazioni" si verifichino effettivamente. –

+0

Sembra essere una tecnica efficiente per migliorare il dispendio di informazioni polimorfiche. Vedi anche: http://en.wikipedia.org/wiki/Adaptive_optimization e http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.199.3894&rep=rep1&type=pdf – Dan

+4

Se quella tecnologia fosse un tale miglioramento rispetto al modello JIT/NJEN sono sicuro che Microsoft l'avrebbe implementato. La dissertazione è del 1994 e l'articolo IBM è del 2004. –

risposta

8

Non ho mai confrontato i due per confrontare, e ho più familiarità con la JVM Sun, posso solo parlare in termini generali di JIT.

Ci sono sempre dei compromessi con le ottimizzazioni e non tutte le ottimizzazioni funzionano sempre. Tuttavia, ecco alcune moderne tecniche di JIT.Penso che questo possa essere l'inizio di una buona conversazione, se ci atteniamo al materiale tecnico:

C'è anche funzioni utili per quanto buono implementazioni di una VM andare:

  • essere in grado di scegliere tra GC
  • implementazioni personalizzazione di ogni GC
  • parametri di assegnazione mucchio (quali la crescita)
  • pagina bloccaggio

Sulla base di queste caratteristiche e molti altri, possiamo Confronta VM, e non solo "Java" rispetto a ".NET", ma, ad esempio, Sun's JVM contro IBM JVM contro .NET contro Mono.

Ad esempio, JVM di Sun non esegue l'ottimizzazione tail-call, IIRC, ma lo fa l'IBM.

8

A quanto pare qualcuno stava lavorando su qualcosa di simile per Rotor. Non ho accesso a IEEE, quindi non posso leggere l'abstract.

Dynamic recompilation and profile-guided optimisations for a .NET JIT compiler

preventivo da Sommario ...

Una valutazione del quadro utilizzando una serie di programmi di test mostra che prestazioni possono migliorare al massimo del 42,3% e 9% in media. nostri risultati mostrano anche che le spese generali di raccolta profilo accurato informazioni attraverso strumentazione misura superano i benefici di ottimizzazioni profilo-guida nel nostro attuazione, suggerendo la necessità di tecniche che possono ridurre tali spese generali di attuazione .

+1

Punto interessante. Mi chiedo se questo è il motivo per cui l'opzione -server sembra fare una gran differenza in Java, forse essi presumono che se non ha l'opzione -server che la ricompilazione aggressiva non sarà un buon compromesso, ma con -server si suppone che si potrebbe essere in esecuzione per mesi quindi si potrebbe anche andare avanti e farlo funzionare nel miglior modo possibile ... –

14

Seguono due diverse strategie. Non penso che uno sia migliore dell'altro.

  • .NET non interpretare il bytecode, quindi deve JIT tutto come viene viene eseguito e quindi non può ottimizzare pesantemente a causa di vincoli di tempo. Se hai bisogno di grosse ottimizzazioni in qualche parte del codice, puoi sempre farlo manualmente con NGEN, oppure fare un'implementazione veloce ma unsafe. Inoltre, calling native code is easy. L'approccio qui sembra ottenere il tempo di esecuzione abbastanza buono e ottimizzare manualmente i colli di bottiglia.

  • Le JVM moderne di solito interpretano la maggior parte del codice e quindi eseguono una compilazione ottimizzata dei colli di bottiglia. Questo di solito ottiene risultati migliori rispetto al JITing diretto, ma se hai bisogno di più, non hai unsafe in Java e calling native code is not nice. Quindi l'approccio qui è quello di eseguire il più possibile l'ottimizzazione automatica, perché le altre opzioni non sono così buone.

In realtà le applicazioni Java tendono a presentare prestazioni leggermente migliori nel tempo e peggio nello spazio rispetto a .NET.

+0

Miglior risposta. Anche se non sono un esperto di Java, penso che l'equivalente di PInvoke sia il più semplice JNA (http://en.wikipedia.org/wiki/Java_Native_Access) e non JNI. – ygoe

3

Potresti essere interessato a SPUR che è un compilatore Tracing JIT. Il focus è su javascript ma funziona su CIL e non sul linguaggio stesso. È un progetto di ricerca basato su Bartok e non su .NET VM standard. Il documento presenta alcuni benchmark delle prestazioni che mostrano 'esegue in modo coerente più veloce di SPUR-CLR' che è lo standard 3.5 CLR. Tuttavia non ci sono stati annunci sul suo futuro relativo alla VM attuale. Le tracce possono attraversare i limiti del metodo che non è qualcosa HotSpot fa AFAIK, JIT JIT di tracciamento sono menzionati here.

Sarei titubante nel dire che .NET VM è una generazione indietro soprattutto se si considerano tutti i sottosistemi, in particolare i generici. In che modo lo GC e il DLR vs confronto invocato dinamico non sono sicuro ma ci sono molti dettagli su di loro in posti come channel9.