预加载装配

时间:2009-02-14 10:47:45

标签: c# .net optimization assemblies

在工作中,我们使用DevExpress作为用户界面。第一次打开使用DevExpress控件的表单会有很长的停顿时间(某些客户端有时会持续15-20秒)。在Visual Studio中,我可以看到在该阶段正在加载大量的程序集。有没有办法在生成的线程中将该程序集预加载到后台的AppDomain中,例如在登录屏幕弹出之前?

5 个答案:

答案 0 :(得分:4)

另一种选择是强制JIT加载程序集异步而不是手动执行。诀窍是简单地调用控件的构造函数,因此Jit知道它必须开始编译该特定的代码路径。通常会强制它加载所有依赖程序集。只需确保通过try catch包围构造函数的调用。

如何在加载时执行此操作的示例:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        PreJitControls();

        Application.Run(new Form1());
    }

    private static void PreJitControls()
    {           
        ThreadPool.QueueUserWorkItem((t) =>
        {
            Thread.Sleep(1000); // Or whatever reasonable amount of time
            try
            {
                AssemblyPullingControl1 c = new AssemblyPullingControl1();
            }
            catch (Exception) { }

            try
            {
                AssemblyPullingControl2 c = new AssemblyPullingControl2();
            }
            catch (Exception) { }

        });
    }
}

但是你也可以在登录表单的构造函数中做类似的事情,如果这是更好的时间进行预加载。只需将PreJitControls方法移动到登录表单并从构造函数中调用它。

答案 1 :(得分:2)

然而,这会强制您的用户在启动时始终接受该命中。

一般来说,这是一个坏主意(如果你的命中至少推迟它,直到你真的需要它)。可能有帮助的情况是,如果很有可能在不久的将来 使用该功能但系统处于空闲状态,则会触发负载。但这可能很难做到准确。

您可能会看到是否有任何已加载的程序集在您的控制之下和GAC中。如果是这样,你可能会对它们产生影响,这可能会对你UI的这个方面的启动时间产生重大影响。

答案 2 :(得分:1)

我不确定,但我猜测并不是程序集的实际加载是耗时的部分 - 但可能是代码路径的JIT编译。也许你想看看ngen。可能会导致性能问题消失。但一定要了解该工具的含义。

链接: - http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx - http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

答案 3 :(得分:0)

查看Assembly.Load方法。

格罗

答案 4 :(得分:0)

如果您想提高装配速度,为什么不在NGEN上查看代码。预JIT后台的一切。虽然取决于你的应用程序正在做什么,但这有赞成和反对意见。