以下代码 ( by Vitaliy Liptchinsky ) 遍历程序集中的所有类型,并对所有方法调用 PrepareMethod。这会改善冷启动延迟吗?
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))
{
if (method.IsAbstract || method.ContainsGenericParameters)
continue;
System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle);
}
}
});
jitter.Priority = ThreadPriority.Lowest;
jitter.Start();
最佳答案
它不会使启动更快 - 毕竟,它比通常更早而不是更晚地完成工作。实际上可能会稍微减慢启动速度,因为当您的应用程序尝试启动时,您将有另一个线程在工作。
这意味着当该线程完成时,您第一次调用方法时不应看到正常的(微小的)JIT 延迟。 (当然也有构造函数,但你可以根据需要包含它们。)
此外,这可能意味着更多的内存将更早使用,并且 JIT 处理方法时可能会涉及一些锁定,这意味着您的“主”线程可能需要偶尔等待。
就我个人而言,除非我有一些非常好的证据表明它确实有帮助,否则我不会“真正地”使用它。无论如何都要对其进行测试并尝试获得此类证据。如果您不介意启动时间,但希望在实际使用应用程序时获得快速响应时间,这可能会有所帮助。
关于c# - 这是改善 .NET 中冷启动延迟的有效方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5190748/