2011-06-10 24 views
0

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

.NET 4比.NET 2慢吗?

谢谢。

+0

在调试器下运行时,Activator.CreateInstance在.NET 4上运行速度非常慢。 – leppie 2011-06-10 11:54:09

回答

0

我不认为把你的程序集放入GAC会启动性能。 如果可能的话,记录每一条写在加载或初始化事件上的指令,这可能会帮助您识别哪个语句实际上需要时间,并且可以识别正在加载时需要花费时间的库。

+0

我读过安装在GAC中的程序集(我有很多依赖于Devexpress使用的UI组件的依赖项)减少启动时间,因为所有组件的签名都需要验证。那是对的吗? – 2011-06-10 16:40:56

+0

@Andera在某种程度上你是对的,但是它不会给你带来相当大的提升,你正在寻找的表现。我认为它会使表现提高15-20%。你在项目中使用企业库吗? – Deepesh 2011-06-10 18:25:14

1

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

不包括 - 我将谈论一个应用程序运行“野生”用户的机器上,没有调试等

JIT编译器在.NET 4的是,我认为这是公平地说,比.Net 2更好 - 所以不会;它并不慢。

您可以通过在您的应用程序的程序集上运行ngen来显着改善启动时间 - 这会将EXE和DLL预编译为本机图像。但是,通过这样做你会失去一些灵活性,而且一般来说没有太大意义。

您应该可以看到用C++编写的一些MFC应用程序的启动时间 - 所有本机代码,然而取决于它们如何链接,它们可以持续很长时间。

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

4

.NET程序有两种截然不同的启动行为。他们被称为冷启动和热启动。冷启动是一个很慢的启动,当没有.NET程序启动之前,你会得到它。或者当你开始的程序很大,从来没有运行过。操作系统必须在磁盘上找到程序集文件,它们在文件系统高速缓存(RAM)中不可用。这需要一段时间,硬盘速度很慢,并且有很多文件可供查找。一个小的无所事事Winforms应用程序必须加载51个DLL才能开始。一个什么也不做的WPF应用程序在77个DLL中占有重要地位。

当不久以前加载程序集文件时,您将获得热烈的开始。汇编文件数据现在来自RAM而不是慢速磁盘,这就是zippedy-doodah。唯一的启动开销现在是抖动。

对于冷启动几乎没什么可做的,程序集必须以某种方式来到磁盘。快速磁盘有很大的不同,SSD特别有效。使用ngen.exe预先装配一个程序集实际上会使问题变得更糟,它会创建另一个需要找到并加载的文件。这是微软建议而不是 prejitting小组件的原因。用.NET 4程序看到这个问题也很明显,你没有很多绑定到版本4 CLR和框架程序集的程序。无论如何,这随着时间的推移而解决。

还有另一种方法会自动消失。 Windows SuperFetch功能将开始注意到您经常加载CLR和jitted Framework程序集,并且会开始自动将它们预加载到RAM中。与Microsoft Office和Adobe Reader的'优化器'使用相同的技巧。他们也是有很多DLL依赖项的程序。非托管的,这个问题不是特定于.NET的。这些优化器很粗糙,它们会在您登录时预加载DLL。哪个是'我非常重要,用其他方式'来解决这个问题,确保你禁用它们,这样它们就不会挤出SuperFetch可以使用的RAM空间。

+0

如何跟踪发生了什么?我注意到主窗体的构造函数需要很多时间才能执行(特别是InitializeComponents),但这种情况在应用程序每次启动时都不会发生,并且通常在启动时需要更多的时间。 – 2011-06-10 16:42:12