测量启动性能c#应用程序

时间:2011-06-10 11:50:35

标签: c# performance

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

.NET 4比.NET 2慢吗?

3 个答案:

答案 0 :(得分:4)

.NET程序有两种不同的启动行为。它们被称为冷启动和热启动。冷启动是慢启动,当没有启动.NET程序时,你会得到它。或者当你开始的程序很大而以前从未运行过。操作系统必须在磁盘上找到汇编文件,它们在文件系统缓存(RAM)中不可用。这需要一段时间,硬盘速度很慢,有很多文件可供查找。一个小的do-nothing 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空间。

答案 1 :(得分:1)

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

排除这一点 - 我将讨论一个应用程序在用户机器上“疯狂地”运行,没有调试器等。

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

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

您应该看到一些用C ++编写的MFC应用程序的启动时间 - 所有本机代码,但是根据它们的链接方式,它们可能需要一段时间。

当然,这也取决于应用程序在启动时实际执行的操作!

答案 2 :(得分:0)

我不认为将您的程序集放在GAC中会启动性能。 如果可能的话,记录您在加载或Intialize事件上编写的每条指令,这些事件可以帮助您识别实际花费时间的语句,并且可以识别正在加载的文库。

相关问题