gpt4 book ai didi

c# - .NET 首次运行方法时发布代码非常慢。如何使用 NGen 修复它?

转载 作者:行者123 更新时间:2023-11-30 15:28:40 25 4
gpt4 key购买 nike

我已经在 Release模式 (x64) 中部署了一个应用程序,我希望它很快,但我注意到每当一个新方法或一组方法首次执行时,速度就会严重下降。当我说严重时,我的意思是第一次执行 100-200 毫秒,之后不到 1 毫秒。

根据我的发现,这似乎是由于 JIT 编译器造成的,它应该在第一次运行时编译方法。我预计这会有一些延迟,但 100 毫秒在执行过程中是一个灾难性的延迟。

我知道 NGen,但 NGen 需要在机器上安装时完成。适用于所有人的机器具有有限的用户权限,无法安装任何东西。该应用程序部署为可执行文件和引用 DLL。我认为这就是我永远无法让 NGen 工作的原因。

有没有办法让JIT在启动时编译每个方法?

我虽然创建了虚拟变量并添加了一个启动例程,该例程除了运行每个方法一次什么都不做,这样它就可以在启动完成时执行。这是否足以强制编译或是否需要单独执行方法的每个代码路径。

最佳答案

哇。这种延迟对于 JIT 来说是不寻常的。分析您的应用以确保瓶颈是 JIT。

现在,如果它真的是 JIT,这里有一个比在各处添加伪参数更好的方法:

使用RuntimeHelpers.PrepareMethod在每个非泛型方法上。此函数将强制 JIT 对其进行处理。

您还可以使用 RunClassConstructor每个类上的方法...好吧,运行它们的静态构造函数。

这是一些(完全未经测试的)代码:

foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
if (type.IsGenericTypeDefinition || type.IsInterface)
continue;

RuntimeHelpers.RunClassConstructor(type.TypeHandle);

foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly))
RuntimeHelpers.PrepareMethod(method.MethodHandle);
}

关于c# - .NET 首次运行方法时发布代码非常慢。如何使用 NGen 修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289484/

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