使用 .NET 为我的应用程序本身提供了良好的性能,但我的应用程序的初始加载时间非常长。其中很多用于装载难以测量的组件。
是否有任何优化可以应用于我的程序集,以使它们在不涉及 GAC 或 Ngen 的情况下更快地加载,而这些优化不适用于 ClickOnce?
这是一个 WinForms 2.0 项目。我可以将它升级到 3.5,但这限制了我的用户群。我的机器上安装了 .NET Framework 3.5。
使用 .NET 为我的应用程序本身提供了良好的性能,但我的应用程序的初始加载时间非常长。其中很多用于装载难以测量的组件。
是否有任何优化可以应用于我的程序集,以使它们在不涉及 GAC 或 Ngen 的情况下更快地加载,而这些优化不适用于 ClickOnce?
这是一个 WinForms 2.0 项目。我可以将它升级到 3.5,但这限制了我的用户群。我的机器上安装了 .NET Framework 3.5。
我创建了一个非常小的 .exe,它会尽快显示启动画面。之后我初始化一切。
JIT 编译器加载从正在被 jit 处理的方法调用的模块。因此,您必须注意显示初始屏幕的方法不会调用您不想加载的模块中的方法。
例子:
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)] 以便 jit 不会内联 ContinueStartup() 方法,因为这会导致模块过早加载。
您可以使用 ILMerge 将所有程序集合并到一个文件中。将一个文件读入内存比读 10 个文件要快。尽管我怀疑您会在那里看到加载速度的真正提高。
您还可以删除对其他程序集的所有引用,将 ui 加载给用户,当他使用 UI(键入或其他)时,使用 Assembly.Load 预加载所有需要的程序集,使用反射和存储获取所有需要的函数指针他们在内部成员中。这样应用程序将加载得更快。但我不认为任何理智的人会做这样的优化。
你能描述一下你有多少个组件吗?
.NET 在您需要时即时加载程序集。您可以决定将您的应用程序拆分为多个程序集。程序集必须通过以下方式进行划分:部署策略、安全性和性能。大多数应用程序分为 3 层结构(UI、业务、数据)。