以下代码 ( 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/

10-17 02:05