衡量c#应用程序的启动性能

本文关键字:启动 性能 应用程序 衡量 | 更新日期: 2023-09-27 17:58:55

我注意到,有时.net 4.0 c#应用程序需要很长时间才能启动,而没有任何明显的原因。我能确定实际发生了什么,加载了哪些模块吗?我正在使用一些外部程序集。把它们放进广汽能提高性能吗?

.NET 4比.NET 2慢吗?

衡量c#应用程序的启动性能

.NET程序有两种不同的启动行为。它们被称为冷启动和热启动。冷启动是一种缓慢的启动方式,以前没有启动.NET程序时就会出现这种情况。或者当您启动的程序很大并且以前从未运行过时。操作系统必须在磁盘上找到程序集文件,它们在文件系统缓存(RAM)中不可用。这需要一段时间,硬盘速度很慢,而且有很多文件要找。一个小的无所事事的Winforms应用程序必须加载51个DLL才能启动。一个无所事事的WPF应用程序有77个DLL。

不久前加载程序集文件时,您就有了一个良好的开端。汇编文件数据现在来自RAM,而不是慢速磁盘,这就是zippeddy dodah。现在唯一的启动开销就是抖动。

对于冷启动,您几乎无能为力,组件必须以某种方式来自磁盘。一个快速的磁盘有很大的不同,固态硬盘特别有效。使用ngen.exe预jit程序集实际上会使问题变得更糟,它会创建另一个需要查找和加载的文件。这就是Microsoft建议不要预调试小程序集的原因。看到.NET 4程序的这个问题也很明显,你没有很多程序绑定到版本4的CLR和框架程序集。无论如何,现在还没有,这会随着时间的推移自行解决。

还有另一种方法可以让这个问题自动消失。Windows SuperFetch功能将开始注意到,您经常加载CLR和jitted Framework程序集,并将开始自动将它们预加载到RAM中。微软Office和Adobe Reader的"优化器"使用了同样的技巧。它们也是有很多DLL依赖关系的程序。非托管的,问题不是.NET特有的。这些优化器很粗糙,当你登录时,它们会预加载DLL。这就是解决这个问题的"我真的很重要,把其他一切都搞砸"方法,确保你禁用它们,这样它们就不会挤掉SuperFetch可以使用的RAM空间。

启动时间很可能是由于运行时JIT将程序集IL编译为机器代码以供执行。正如另一位回答者所建议的那样,它也可能受到调试器的影响。

除此之外,我将讨论一个在用户机器上"野外"运行的应用程序,没有调试器等。

.Net 4中的JIT编译器,我认为可以公平地说,比.Net 2中的要好——所以不;它并不慢。

通过在应用程序的程序集上运行ngen,可以显著缩短启动时间——这将EXE和DLL预编译为本机映像。然而,这样做会失去一些灵活性,总的来说,没有什么意义。

你应该看到一些用C++编写的MFC应用程序的启动时间——都是本机代码,但根据它们的链接方式,它们可能需要同样长的时间。

当然,它也取决于应用程序在启动时实际在做什么!

我不认为将程序集放入GAC会提高性能。如果可能的话,为您在加载或初始化事件上编写的每条指令进行日志记录,这可能有助于您确定哪条语句实际需要时间,这样您就可以确定加载过程中需要时间的库。