这是否是改善.NET冷启动延迟的有效方法?

Cra*_*ton 12 c# cold-start

以下代码(由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();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

它不会让启动更快 - 毕竟,它比通常更早地工作,而不是更晚.实际上可能会稍微减慢启动速度,因为当您的应用程序尝试启动时,您将有另一个线程正在工作.

这意味着在线程完成时,您第一次调用方法时不应该看到正常(微小)JIT延迟.(当然也有构造函数,但如果需要,可以包含它们.)

此外,它可能意味着更早的内存将被使用,并且JIT处理方法可能涉及一些锁定,这意味着您的"主"线程可能需要偶尔等待.

我个人不会"真实地"使用它,除非我有一些非常好的证据表明它实际上有所帮助.通过各种方式测试它并试图获得这样的证据.如果您不介意启动时间,但是当您实际使用该应用程序时需要快速响应时间,则可能有所帮助.

  • @Craig:你有没有向用户介绍过这个问题?我宁愿在应用程序的生命周期中传播几个基本上不易察觉的暂停,而不是在启动时等待 - 尤其是当我等待JIT编译的方法时,我可能永远不会最终执行. (4认同)