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?
我想为函数添加一个布尔参数,如果设置,则立即退出函数,因此实际上没有执行任何代码.我可以用这种方式"预链接",但我认为这是一个我想避免的令人讨厌的解决方案.
任何的想法?
创建一个委托,其目标是该方法。这有什么意义呢?
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)