2012-12-01 10 views
5

Sono l'autore di un emulatore di psp realizzato in C#.prelink DynamicMethod

Sto generando un sacco di "DynamicMethod" utilizzando ILGenerator. Sto convertendo il codice assembly in un AST e quindi generando il codice IL e creando quel DynamicMethod. Lo sto facendo in un altro thread, quindi posso generare nuovi metodi mentre il programma sta eseguendo altri in modo che possa funzionare senza intoppi.

Il mio problema è che la generazione del codice nativo è pigra, quindi il codice macchina viene generato quando viene chiamata la funzione, non quando viene generato IL. Così genera nel thread di esecuzione del programma, la generazione del codice nativo è molto lenta in quanto è asm-> ast-> il passo.

Ho provato il metodo Marshal.Prelink che si presuppone di generare il codice macchina prima di eseguire la funzione. Funziona su Mono, ma non funziona su MS .NET.

Marshal.Prelink(MethodInfo); 

C'è un modo di prelinking un DynamicMethod su MS .NET?

Ho pensato di aggiungere un parametro booleano alla funzione che, se impostata, chiude immediatamente la funzione in modo che nessun codice venga effettivamente eseguito. Potrei "prelinkare" in questo modo, ma penso che sia una soluzione sgradevole che voglio evitare.

Qualche idea?

risposta

0

I found someone saying that creating a delegate to the dynamic method would force JIT:

crea un delegato la cui destinazione è il metodo. Qual è il punto di questo?

This one sounds promising too:

Thread jitter = new Thread(() => 
{ 
    foreach (var type in Assembly.Load("MyHavyAssembly, Version=1.8.2008.8," + 
      " Culture=neutral, PublicKeyToken=8744b20f8da049e3").GetTypes()) 
    { 
    foreach (var method in type.GetMethods(BindingFlags.DeclaredOnly | 
         BindingFlags.NonPublic | 
         BindingFlags.Public | BindingFlags.Instance | 
         BindingFlags.Static)) 
    { 
     System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle); 
    } 
    } 
}); 
jitter.Priority = ThreadPriority.Lowest; 
jitter.Start(); 
+1

Io davvero non capisco perché creare un delegato forza JIT. E il secondo metodo dovrebbe essere usato con CERs (regioni di esecuzione vincolate), non è sicuro che sia la strada giusta. – svick

0

Leggendo le informazioni sul motivo per cui non il suo lavoro la documentazione MSDN dice il seguente ::

Calling Prelink su un metodo al di fuori della piattaforma di invoke non ha alcun effetto.

sto zitto convinto che se si utilizza il restrictedskipverification o skipverification sarà JIT il metodo.

Anche se ho torto, la tua idea di cortocircuito non è negativa.

Problemi correlati