减少应用程序启动时间
当您构建 .NET 应用程序时,它会被编译成 Microsoft 中间语言 (MSIL)。当用户启动应用程序时,其 MSIL 代码由“即时” (JIT) 编译器编译成机器代码。此过程可能会导致明显的延迟。除了您自己的应用程序之外,还可以加载外部 DLL(例如 DevExpress DLL),这意味着任何延迟都不仅仅取决于代码的大小。
本主题介绍如果由于 JIT 编译而导致应用程序出现明显延迟,如何减少 WPF 或 WinForms 应用程序启动时间。
.NET 框架
将 IL 代码编译为本机代码
使用Native Image Generator (Ngen.exe)工具将程序集的 IL 代码编译为本机代码。当最终用户运行您的应用程序时,CLR 从本机图像缓存加载预编译代码,因此在运行时不需要编译。Ngen.exe工具随 .NET Framework SDK 一起提供。
您可以将应用程序的 IL 代码(及其依赖项的 IL 代码)编译为本机代码,如下所示:
X86
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\MyApp.exe
X64
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe install C:\MyApp.exe
部署应用程序后运行Ngen.exe 。
下一代。exe生成的代码不如 JIT 编译器生成的代码高度优化。
有关各种本机映像生成功能的信息,请参阅以下文章:Ngen.exe(本机映像生成器)。
使用多核 JIT
在 .NET Framework 4.5 及更高版本中,您可以使用System.Runtime.ProfileOptimization类来启用多核 JIT。多核 JIT使用并行化来减少应用程序启动期间的 JIT 编译时间。
笔记
使用多核 JIT 不如将 IL 代码编译为本机代码有效。
下面的代码示例演示了如何在您的应用程序中启用多核 JIT。
public App() { // Defines where to store JIT profiles ProfileOptimization.SetProfileRoot(@"C:\MyAppFolder"); // Enables Multicore JIT with the specified profile ProfileOptimization.StartProfile("Startup.Profile"); }
应用程序第一次启动时,JIT 编译器会记录它应该编译的每个方法。然后 CLR 保存已执行方法的概要文件。ProfileOptimization.SetProfileRoot方法指定保存配置文件的现有文件夹。目前未应用多核 JIT。
应用程序第二次运行时,ProfileOptimization.StartProfile方法从磁盘加载指定的配置文件,并使用此信息在后台编译方法,然后再从主线程调用它们。
有关详细信息,请参阅以下文章:
NET Core - 准备运行图像
.NET/.NET Core允许您通过将应用程序编译为ReadyToRun (R2R)格式来减少应用程序启动时间。
R2R 二进制文件包含类似于即时 (JIT) 编译器生成的本机代码。本机代码用于减少 JIT 编译器在加载应用程序时需要执行的工作量。
要以 R2R 格式发布应用程序,请在项目文件中将<PublishReadyToRun>
选项设置为:true
<PropertyGroup>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
R2R 二进制文件更大,因为它们包含本机代码和 IL 代码。
有关详细信息,请参阅以下主题:部署 .NET/.NET Core 应用程序。
本文来自博客园,作者:jevan,转载请注明原文链接:https://www.cnblogs.com/DoNetCShap/p/16400889.html