3

我们的 C# 客户端应用程序在首次运行时总是需要更长的时间来加载。我还没有测试它是否是任何较慢的 .NET 应用程序的第一次运行,或者每个.NET 应用程序的第一次运行是否较慢,但无论如何它仍然是一个问题。我们如何才能消除这种一次性的启动打击?

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


回复:一些答案,我们正在部署发布模式的 DLL,并且减速仅在第一次启动时。我们正在尽可能地延迟类的初始化。

4

4 回答 4

10

它是让您在第一次运行 .net 应用程序时等待的 JIT(即时编译)。这会在运行代码之前将您的 IL 编译为机器代码。仅第一次发生这种情况的原因是机器代码版本随后存储在磁盘上并被重复使用。

您可以使用NGEN.EXEpre-jit 您的应用程序...

这需要在您运行软件的计算机上完成,因为 JIT 将针对运行它的 CPU 进行编译和优化。您可以在程序安装过程中执行此操作...

于 2009-06-26T17:44:01.057 回答
4

其他答案谈到了 JIT 时间,但根据我的经验,另一个非常重要的因素是启动后第一次加载 .NET 框架本身所花费的时间。

尝试编写一个绝对微不足道的程序(尽管最好至少涉及您的真实代码使用的程序集)。编译它并重新启动。运行琐碎的程序,然后(完成后)运行您的真实应用程序 - 看看它与在重新启动后运行您的真实应用程序而不运行琐碎应用程序相比如何。

于 2009-06-26T17:56:12.350 回答
3

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

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

于 2009-06-26T17:46:30.273 回答
1

我感觉启动延迟是在将 MSIL 转换为本机代码的 .NET 运行时。

您可以在安装时生成您的程序集,这会将它们编译为本机代码并可能防止启动延迟。WiX ( http://wix.sourceforge.net ) 有一个自定义操作可以做到这一点。

于 2009-06-26T17:45:54.407 回答