我们的C#客户端应用程序在首次运行时总是需要更长的时间才能加载。我还没有测试它是否是第一次任何 .NET应用程序的运行速度较慢,或者第一次运行的每个 .NET应用程序是更慢,但无论如何它仍然是一个问题。我们怎样才能消除这种一次性的启动命中?
我最初的想法是,某种服务可以“热身”库。我们需要为每个应用程序或任何.NET应用程序执行此操作吗?服务运行的用户是否会有所作为?也许不是Windows服务,在Windows登录上运行的应用程序可以执行肮脏的工作吗?那么,它是一个.NET服务是否足够,或者我们是否必须运行我们的每个程序以消除惩罚?我们可以传入一个命令行参数来告诉程序立即退出,但是这样就足够了,还是我们需要.NET加载我们将在应用程序正常执行期间使用的每个程序集?
Re:有些答案,我们正在部署发布模式的DLL,而减速只在第一次启动时。我们正在尽可能地延迟类的初始化。
答案 0 :(得分:10)
它是JIT(即时编译),可让您在第一次运行.net应用程序时等待。这会在运行代码之前将IL编译为机器代码。这种情况仅在第一次发生时才会将机器代码版本存储在磁盘上并重复使用。
您可以使用NGEN.EXE
预先启动应用程序......
这需要在运行该软件的计算机上完成,因为JIT将对其运行的CPU进行编译和优化。您可以将其作为程序安装的一部分......
答案 1 :(得分:4)
其他答案已经谈到了JIT时间,但根据我的经验,另一个非常重要的因素是在启动后第一次加载.NET框架本身所花费的时间。
尝试编写一个绝对琐碎的程序(尽管最好是一个至少触及真实代码使用的程序集的程序)。编译并重新启动。运行简单的程序,然后(当它完成时)运行您的真实应用程序 - 看看与重新启动后运行真实应用程序相比如何,而不是运行简单的应用程序。
答案 2 :(得分:3)
阅读this(改进应用程序启动时间),this(.NET Framework 3.5 SP1中的CLR优化)和this(NGen的性能优势)。
改善启动时间的主要思想是尽可能使用延迟初始化。启动后不要立即实例化那些不必要的东西。等等,等等。
答案 3 :(得分:1)
我感觉启动延迟是在.NET运行时将MSIL转换为本机代码。
你可能会在安装时使用你的程序集,这会将它们编译为本机程序 代码,可能会阻止启动延迟。 WiX(http://wix.sourceforge.net)有一个自定义操作就可以做到这一点。