衡量启动性能C#应用程序

And*_*gar 0 c# performance

我注意到有时.net 4.0 c#应用程序需要很长时间才能启动,而没有任何明显的原因。我可以确定实际发生了什么,加载了哪些模块?我正在使用许多外部程序集。可以将它们放入GAC中来提高绩效吗?

.NET 4比.NET 2慢吗?

Han*_*ant 5

.NET程序具有两种不同的启动行为。它们分别称为冷启动和热启动。冷启动是一种缓慢的启动方式,如果之前没有启动过.NET程序,就会得到启动。或者,当您启动的程序很大且从未运行过时。操作系统必须在磁盘上找到程序集文件,这些文件在文件系统缓存(RAM)中将不可用。这需要一段时间,硬盘速度很慢,并且有很多文件要查找。一个小型的Winforms应用程序必须加载51个DLL才能开始。什么都不做的WPF应用程序包含77个DLL。

在不久之前加载程序集文件时,您将获得一个良好的开端。汇编文件数据现在来自RAM而不是慢磁盘,即zippedy-doodah。现在唯一的启动开销就是抖动。

关于冷启动,您几乎无能为力,程序集必须以一种或另一种方式进入磁盘。快速的磁盘有很大的不同,SSD尤其有效。使用ngen.exe预先组装程序集实际上会使问题变得更糟,它会创建另一个需要查找并加载的文件。这就是Microsoft建议不要预先设置小型程序集的原因。也强烈指出了.NET 4程序出现此问题的情况,您没有很多程序可以绑定到版本4 CLR和框架程序集。无论如何,随着时间的流逝,这会自行解决。

此问题有另一种自动消失的方式。Windows SuperFetch功能将开始注意到您经常加载CLR和jitted Framework程序集,并将开始自动将它们预先加载到RAM中。Microsoft Office和Adobe Reader“优化程序”使用的同种技巧。它们也是具有很多DLL依赖项的程序。对于非托管类,问题并非特定于.NET。这些优化器是粗糙的,在您登录时会预加载DLL。解决问题的方法是“我真的很重要,解决所有其他问题”,请确保禁用它们,以免它们挤占SuperFetch可以使用的RAM空间。