gpt4 book ai didi

c# - 动态方法预链接

转载 作者:太空狗 更新时间:2023-10-29 23:51:58 24 4
gpt4 key购买 nike

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

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

我的问题是 native 代码生成是惰性的,所以机器代码是在调用函数时生成的,而不是在生成 IL 时生成的。所以它在程序执行线程中生成,本地代码生成非常慢,因为它是 asm->ast->il 步骤。

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

Marshal.Prelink(MethodInfo);

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

我想向函数添加一个 bool 参数,如果设置了该参数,则立即退出该函数,因此不会实际执行任何代码。我可以那样“预链接”,但我认为这是一个我想避免的令人讨厌的解决方案。

有什么想法吗?

最佳答案

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

Create a delegate whose target is the method. What's the point of this?

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();

关于c# - 动态方法预链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13655402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com