DynamicMethod prelink

soy*_*wiz 5 c# performance il abstract-syntax-tree

我是用C#制作的psp模拟器的作者.

我正在使用ILGenerator生成大量"DynamicMethod".我正在将汇编代码转换为AST,然后生成IL代码并构建DynamicMethod.我在另一个线程中执行此操作,因此我可以在程序执行其他程序时生成新方法,以便它可以顺利运行.

我的问题是本机代码生成是懒惰的,因此在调用函数时生成机器代码,而不是在生成IL时生成.因此它在程序执行线程中生成,本机代码生成速度非常慢,因为它是asm-> ast-> il步.

我尝试过Marshal.Prelink方法,它在执行函数之前生成机器代码.它适用于Mono,但它不适用于MS .NET.

Marshal.Prelink(MethodInfo);
Run Code Online (Sandbox Code Playgroud)

有没有办法在MS .NET上预先链接DynamicMethod?

我想为函数添加一个布尔参数,如果设置,则立即退出函数,因此实际上没有执行任何代码.我可以用这种方式"预链接",但我认为这是一个我想避免的令人讨厌的解决方案.

任何的想法?

Jul*_*anR 0

我发现有人说创建动态方法的委托会强制 JIT:

创建一个委托,其目标是该方法。这有什么意义呢?

这听起来也很有希望:

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();
Run Code Online (Sandbox Code Playgroud)