使用.NET可以为应用程序本身提供良好的性能,但是我的应用程序的初始加载时间非常长。很多都是用于装载难以测量的组件。
我是否可以对我的程序集应用任何优化,以便在不涉及GAC或Ngen的情况下加快加载速度,而且这些优化不适用于ClickOnce?
这是一个WinForms 2.0项目。我可以将它升级到3.5,但这限制了我的用户群。 我的计算机上安装了.NET Framework 3.5。
答案 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,业务,数据)。