Loading

减少应用程序启动时间

当您构建 .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 应用程序

posted @ 2022-06-22 15:44  jevan  阅读(138)  评论(0编辑  收藏  举报