.NET应用程序负载优化

时间:2009-03-08 22:34:57

标签: c# .net cold-start

使用.NET可以为应用程序本身提供良好的性能,但是我的应用程序的初始加载时间非常长。很多都是用于装载难以测量的组件。

我是否可以对我的程序集应用任何优化,以便在不涉及GAC或Ngen的情况下加快加载速度,而且这些优化不适用于ClickOnce?

这是一个WinForms 2.0项目。我可以将它升级到3.5,但这限制了我的用户群。 我的计算机上安装了.NET Framework 3.5。

3 个答案:

答案 0 :(得分:2)

我创建了一个非常小的.exe,尽快显示启动画面。之后我将所有内容初始化。

JIT编译器加载从正在进行jitted的方法调用的模块。所以你必须注意显示启动画面的方法,不要调用你不想加载的模块中的方法。

示例:

internal sealed class Startup {

    // Call Startup.Run() from Program.Main to start the application
    internal void Run() {
        this.ShowSplash();
        this.ContinueStartup();
    }

    private void ShowSplash() {
        _splash = new Splash();
        _splash.Show();
        Application.DoEvents();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    private void ContinueStartup() {
        // Do the startup here
    }
}

需要[MethodImpl(MethodImplOptions.NoInlining)],因此jt不会使ContinueStartup()方法内联,因为这会导致模块过早加载。

答案 1 :(得分:1)

您可以使用ILMerge将所有程序集合并到一个文件中。将一个文件读入内存比读取10个文件更快。虽然我怀疑你会看到负载速度的真正改善。

您还可以删除对其他程序集的所有引用,将ui加载到用户,并在使用UI(键入或其他内容)时使用Assembly.Load预加载所有需要的程序集,使用所有需要的函数指针反思并将它们存储在内部成员中。这样,应用程序加载速度会快得多。但我认为任何理智的人都不会像这样进行优化。

答案 2 :(得分:0)

您能描述一下您拥有的装配数量吗?

.NET在您需要时动态加载程序集。您可以决定将应用程序拆分为多个程序集。必须通过以下方式划分程序集:部署策略,安全性和性能。大多数应用程序分为3层结构(UI,业务,数据)。