2009-06-26 60 views
3

我们的C#客户端应用程序在第一次运行时总是需要更长的时间才能加载。我至今没有去,以测试是否是任何 .NET应用程序,速度较慢,或者如果第一次运行每个 .NET应用程序是慢,但它仍然是在任何情况下,问题的第一次运行。我们如何消除这一次启动命中?如何加速我的.NET应用程序的第一次执行的性能?

我最初的想法是某种服务可以“预热”这些库。我们是否需要为我们的每个应用程序或只是任何.NET应用程序执行此操作?服务运行的用户会有所作为吗?也许而不是Windows服务,在Windows登录上运行的应用程序可以做肮脏的工作?再说一次,它是一个.NET服务就够了,还是我们必须运行我们的每个程序来消除处罚?我们可以传入一个命令行参数来告诉程序立即退出,但这样做是否足够,或者我们是否需要.NET来加载我们将在正常执行应用程序期间使用的每个程序集?


回复:一些答案,我们正在部署版本模式的DLL,并放缓仅在第一次启动。我们尽可能延迟类的初始化。

回答

4

其他的答案都谈到JIT的时间,但在我的经验,另一个非常显著因素是加载.NET框架本身的启动后第一次所用的时间。

尝试写一个绝对重要的程序(虽然preferrably一个至少触动你真正的代码使用的组件)。编译并重新启动。运行微不足道的程序,然后(完成时)运行真正的应用程序 - 查看与重新启动后运行实际应用程序的方式比较,而无需运行微不足道的应用程序。

10

它可以让你等待你运行你的应用程序的.NET首次JIT(即时编译)。这会在运行代码之前将您的IL编译为机器代码。这只是第一次发生的原因是机器代码版本然后存储在磁盘上重用。

您可以使用NGEN.EXE预JIT你的应用程序...

这需要你运行该软件的计算机上完成,因为JIT编译和优化运行它的CPU。你可以这样做,因为你的程序安装的一部分...

+2

Paint.NET http://getpaint.net在安装过程中执行此操作。它运作良好。 – BoltBait 2009-06-26 17:50:30

+0

在下面引用的页面上,“如果您使用NGEN,则需要注意当本机映像加载到内存时可能发生重新绑定...如果您将多个DLL构建为应用程序的一部分,则在加载应用程序时重新绑定将最终发生,因为分配给每个DLL的默认基址始终相同(0x400000)。“ 我们包含许多DLL作为我们的主要应用程序(> 20)。我们仍然会看到一个好处吗? – 2009-06-26 17:58:15

1

我有一种感觉的启动延迟是在.NET运行时转换MSIL到本地代码。

你可能NGEN安装在你的组件,这将他们编译为本地代码 和将可能阻止启动延迟。 WiX(http://wix.sourceforge.net)有一个自定义操作,就是这么做的。

3

阅读this(提高应用程序启动时间),this(.NET Framework 3.5 SP1中的CLR优化)和this(NGen的性能优势)。

改善启动时间的主要思想是尽可能使用延迟初始化。不要在启动后立即实例化那些不必要的东西。等,等,等

相关问题