Domanda

So che Java di HotSpot JIT a volte saltare JIT la compilazione di un metodo se si aspetta che il overhead di compilazione sia inferiore al sovraccarico di eseguire il metodo in modo interpretato. Fa .NET CLR lavoro basato su un'euristica simile?

È stato utile?

Soluzione

Nota: questa risposta è in un contesto "per-run". Il codice è normalmente JITted ogni volta che si esegue il programma. Utilizzando ngen o . NET nativo cambia quella storia, troppo ...

A differenza di HotSpot, il JIT CLR compila sempre esattamente una volta per ciclo. Non è mai interpreta, e non è mai ricompila con l'ottimizzazione dei più pesante di prima basata sull'utilizzo effettivo.

Questo può cambiare, ovviamente, ma è stato così fin v1 e non mi aspetto di cambiarla in qualunque momento presto.

Il vantaggio è che rende il JIT molto più semplice -. Non c'è bisogno di prendere in considerazione il codice "vecchio" che è già in esecuzione, svitare ottimizzazioni basate su premesse che non sono più validi etc

Un punto a favore di .NET è che la maggior parte delle lingue CLR fanno metodi non virtuale di default, il che significa molto di più inlining può essere fatto. HotSpot può inline un metodo finché non è sovrascritto prima a quel punto annulla l'ottimizzazione (o fa alcune cose intelligenti in alcuni casi in modo condizionale comunque utilizzare il codice inline, in base al tipo reale). Con un minor numero di metodi virtuali di cui preoccuparsi, .NET può in gran parte ignorare il dolore di non essere in grado di inline nulla virtuale.

EDIT: È possibile che descrive il quadro desktop. Il Compact Framework getta fuori codice nativo quando vuole, JITting di nuovo se necessario. Tuttavia, questo ancora non è come HotSpot ottimizzazione adattativa.

Il quadro micro non JIT affatto a quanto pare, interpretando il codice invece. Questo ha senso per dispositivi molto vincolati. (Non posso dire che so molto circa il quadro micro.)

Altri suggerimenti

Il runtime .NET compila sempre il codice JIT prima dell'esecuzione. Quindi, non è mai interpretato.

È possibile trovare qualche lettura più interessante in Scelte CLR design Anders Hejlsberg . Soprattutto la parte:

  

Ho letto che Microsoft ha deciso che IL sarà sempre essere compilato, mai interpretato. Come funziona la codifica le informazioni sul tipo di istruzioni aiutano gli interpreti in modo più efficiente?

     

Anders Hejlsberg: Se un interprete può ciecamente fare proprio quello che le istruzioni dicono senza bisogno di tenere traccia di ciò che è in cima alla pila, si può andare più veloce. Quando si vede un IADD, ad esempio, l'interprete non prima deve capire quale tipo di inserirlo è, sa che è un intero add. Supponendo che qualcuno ha già verificato che la pila è corretto, è sicuro di tagliare po 'di tempo, e si preoccupano che per un interprete. Nel nostro caso, però, non abbiamo mai intenzione di indirizzare uno scenario interpretato con il CLR. Abbiamo intenzione di sempre JIT [Just-in-time di compilazione], e ai fini del JIT, abbiamo bisogno di tenere traccia delle informazioni di tipo in ogni caso. Dal momento che abbiamo già le informazioni sul tipo, non in realtà ci comprare niente per metterla nelle istruzioni.

     

Bill Venners: Molti JVM moderni [macchine virtuali Java] fanno l'ottimizzazione adattiva, dove cominciano interpretando bytecode. Essi profilo l'applicazione durante l'esecuzione di trovare il 10% al 20% del codice che viene eseguito 80% al 90% del tempo, poi si compilano che a natale. Non necessariamente just-in-time compilare quei bytecode, però. bytecode di un metodo possono ancora essere eseguiti dall'interprete mentre vengono compilati a nativo e ottimizzato in background. Quando il codice nativo è pronto, si può sostituire il bytecode. Evitando di mira uno scenario interpretato, hai completamente escluso che approccio per l'esecuzione in un CLR?

     

Anders Hejlsberg: No, non abbiamo completamente escluso che fuori. Possiamo ancora interpretare. Non stiamo solo ottimizzato per l'interpretazione. Non stiamo ottimizzato per la scrittura che più alto interprete delle prestazioni che vi sempre e solo interpretare. Io non credo che nessuno lo fa più. Per un set top box 10 anni fa, che avrebbe potuto essere interessante. Ma non è più interessante. tecnologie JIT hanno ottenuto al punto in cui si può avere più strategie JIT possibili. Si può anche immaginare di usare un JIT veloce che solo strappa rapidamente, e poi quando scopriamo che stiamo eseguendo un particolare metodo per tutto il tempo, utilizzando un altro JIT che spende un po 'più di tempo e fa un lavoro migliore di ottimizzare. C'è molto di più si può fare JIT-saggio.

Sarà bello vedere alcune squadre investigative comuni traccia basata in futuro per i dispositivi con poca memoria. Sarebbe soprattutto interpretare, trovare i punti caldi, e convertire quelli in assembler e memorizzare nella cache quelli. Credo che questo è ciò che fa Google con il loro JIT Android e Microsoft Research ha un progetto di ricerca in corso per trace-base JIT.

Ho trovato un articolo, SPUR: A tracciabilità Sulla base compilatore JIT per CIL .. Forse alcuni di questo renderà più nella CLR un giorno?

Non credo così, e non credo che sia mai dovrebbe.

Come potrebbe il JIT sapere quante volte un particolare metodo sarebbe chiamato? Non sarebbe la frequenza del fattore di interpretazione nella decisione?

Vorrei anche in discussione quanto bene un compilatore JIT sarebbe in grado di analizzare una funzione per determinare se l'interpretazione sarebbe meglio senza interpretare la funzione stessa. E dato che fatto (che almeno un passaggio del metodo è avvenuta) Non sarebbe meglio compilare semplicemente ogni metodo per ridurre l'overhead di provare a determinare quali metodi ottenere compilato in primo luogo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top