2012-12-01 10 views
5

Jestem autorem emulatora psp wykonanego w języku C#.DynamicMethod prelink

Generuję dużo "DynamicMethod" przy użyciu ILGenerator. Przekształcam kod zestawu w AST, a następnie generuję kod IL i buduję ten DynamicMethod. Robię to w innym wątku, więc mogę generować nowe metody, podczas gdy program wykonuje inne, aby mógł działać płynnie.

Moim problemem jest to, że generowanie kodu natywnego jest leniwy, więc kod maszyny jest generowany, gdy funkcja jest wywoływana, a nie podczas generowania IL. Tak więc generuje w wątku wykonywania programu, generowanie kodu rodzimego jest wyjątkowo powolne, ponieważ jest to krok asm-> ast-> il.

Próbowałem metody Marshal.Popier, że jest suposed do generowania kodu maszyny przed wykonaniem funkcji. Działa na Mono, ale nie działa na MS .NET.

Marshal.Prelink(MethodInfo); 

Czy istnieje sposób prelinkowania DynamicMethod na MS .NET?

Pomyślałem, że dodanie funkcji boolowskiej do funkcji, która jeśli ustawiona, natychmiast kończy działanie, więc żaden kod nie jest faktycznie wykonywany. Mógłbym "prelinkować" w ten sposób, ale myślę, że to nieprzyjemne rozwiązanie, którego chcę uniknąć.

Każdy pomysł?

Odpowiedz

0

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

Tworzenie delegata, którego celem jest metoda. Jaki jest sens tego?

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

Naprawdę nie rozumiem, dlaczego tworzenie delegata siły JIT. Druga metoda ma być używana z CER (ograniczonymi regionami wykonawczymi), nie jest też pewna, czy to właściwa droga. – svick

0

Odczytywanie informacji, dlaczego jej nie działa w dokumentacji MSDN mówi, co następuje ::

Wywołanie Prelink na metodzie poza powołaniem platformy nie ma wpływu.

jestem spokojny przekonany, że jeśli używasz restrictedskipverification lub skipverification będzie JIT metodę.

Chociaż jeśli się mylę, twój pomysł na zwarcie nie jest zły.

Powiązane problemy