首页 > 系统相关 >PowerShell 脚本的作用是通过调用 NGEN (Native Image Generator) 工具来优化 .NET 程序的启动性能。原理、每个步骤的功能以及如何加速 .NET 程序的启动:脚

PowerShell 脚本的作用是通过调用 NGEN (Native Image Generator) 工具来优化 .NET 程序的启动性能。原理、每个步骤的功能以及如何加速 .NET 程序的启动:脚

时间:2024-12-20 21:20:36浏览次数:6  
标签:启动 NGEN 程序 应用程序 编译 dotnet NET

$Env:PATH = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  $pt = $_.Location
  if (! $pt) {continue}
  if ($cn++) {''}
  $na = Split-Path -Leaf $pt
  Write-Host -ForegroundColor Yellow "NGENing $na"
  ngen install $pt
}

 

PowerShell 脚本的作用是通过调用 NGEN (Native Image Generator) 工具来优化 .NET 程序的启动性能。下面我将详细解释其原理、每个步骤的功能以及如何加速 .NET 程序的启动:

原理:

  1. NGEN (Native Image Generator):
    NGEN 是 .NET Framework 提供的一个工具,它允许将程序集(通常是 MSIL,即中间语言代码)预编译成特定于目标机器架构的本地代码。这意味着在程序运行时,不再需要 JIT 编译,从而减少启动时间和提高运行效率。使用 NGEN 工具生成的本地映像存储在特定的缓存中(例如 %windir%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 目录下)。

  2. PowerShell 脚本作用:

    • 脚本的目标是对当前运行的 .NET 程序集执行 NGEN 操作,提前生成本地代码图像。
    • 这样,在下次启动程序时,系统可以直接使用 NGEN 生成的本地映像,从而避免 JIT 编译,提高启动速度。

逐行分析:

powershellCopy Code
$Env:PATH = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
  • 解释:这一行将 PATH 环境变量更新为当前 .NET Runtime 目录的位置。[Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory() 获取当前 .NET 运行时的目录路径,并将其设置为 PATH 变量的值。
  • 作用:确保可以找到 ngen 命令和其他必要的 .NET 工具。
powershellCopy Code
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  $pt = $_. Location
  if (! $pt) {continue}
  if ($cn++) {''}
  $na = Split-Path -Leaf $pt
  Write-Host -ForegroundColor Yellow "NGENing $na"
  ngen install $pt
}
  • 解释:
    • [AppDomain]::CurrentDomain.GetAssemblies() 获取当前应用程序域中所有加载的程序集(Assemblies)。这些程序集是当前运行的 .NET 应用程序的一部分。
    • 对每个程序集,脚本检查其路径($pt = $_.Location)。如果路径不存在,则跳过该程序集。
    • Split-Path -Leaf $pt 获取程序集的文件名(去掉路径),并将其保存在 $na 变量中。
    • 然后,通过 Write-Host 输出当前正在进行 NGEN 操作的程序集文件名。
    • 最后,通过 ngen install $pt 对每个程序集执行 NGEN 操作,生成本地代码映像。

结果:

  • 执行该脚本后,所有加载的程序集都将通过 NGEN 工具进行预编译,生成本地映像。
  • 当程序下一次启动时,Windows 可以直接加载这些本地映像,而不需要再进行 JIT 编译,从而减少了启动时间,提升了性能。

使用场景:

  • 加速 .NET 应用程序启动时间:通过提前编译程序集,可以显著减少 .NET 应用程序首次启动时的等待时间,尤其是当应用程序较大或者依赖于多个程序集时。
  • 服务器和生产环境:对于长期运行的服务器或高性能要求的环境,提前生成本地代码映像可以提高系统的响应速度和运行效率。

注意事项:

  1. 仅适用于 .NET Framework:NGEN 是 .NET Framework 的工具,而不是 .NET Core 或 .NET 5+ 的工具。对于 .NET Core 和 .NET 5+ 以上版本,启动优化主要依赖于其他机制(如 ReadyToRun 或自包含部署)。
  2. 必须为管理员权限运行:由于 ngen 操作涉及到系统目录中的文件修改,运行脚本时需要具有管理员权限。
  3. NGEN 生成的映像与系统架构相关:NGEN 生成的本地代码映像是特定于架构的,因此如果系统架构发生变化(如从 x86 切换到 x64),可能需要重新生成这些映像。

这个脚本是一种常见的优化 .NET 应用程序启动性能的方法,特别适合需要频繁启动和运行的 .NET 应用程序。

除了使用 NGEN(Native Image Generator)以外,还有一些其他方法可以提高 .NET 应用程序的性能,尤其是在启动速度和运行效率方面。以下是几种常见的替代方法或补充方案:

1. ReadyToRun (R2R)

适用环境:.NET Core 和 .NET 5 及以上版本。

简介:
ReadyToRun 是一个类似于 NGEN 的预编译技术,但它专门为 .NET Core 和 .NET 5 及以上版本设计。与 NGEN 不同,ReadyToRun 生成的本地映像更加轻量,并且支持跨平台的应用程序部署。

优点:

  • 跨平台支持:ReadyToRun 适用于 Linux、macOS 和 Windows,支持 .NET Core 和 .NET 5 以上版本的应用程序。
  • 更快速的启动时间:通过预编译部分或全部程序集,应用程序的启动时间得到了显著提升。
  • 无需依赖于 .NET 运行时:ReadyToRun 生成的本地映像可以独立于目标机器上的 .NET 环境,减少了运行时的开销。

使用方法:

  • 在构建应用程序时使用 dotnet publish 命令的 --self-contained 选项,并启用 ReadyToRun 编译: bashCopy Code
    dotnet publish -c Release -r win-x64 --self-contained true /p:PublishReadyToRun=true

2. AOT(Ahead-of-Time)编译

适用环境:.NET 6+、.NET MAUI、Xamarin 和 Blazor 等。

简介:
AOT 编译指的是在应用程序发布时就进行完整的代码编译,而不是在运行时使用 JIT(即时编译)。AOT 编译能够生成平台特定的本地代码,从而减少应用启动时的编译开销。

优点:

  • 更低的启动时间:由于应用程序已经提前编译成本地代码,启动时无需等待 JIT 编译过程。
  • 适用于无依赖环境:AOT 编译的应用可以更容易地部署到没有完整 .NET 运行时环境的设备上。
  • 跨平台部署:尤其在使用 .NET 6+ 或 .NET MAUI 时,AOT 编译支持多平台(Windows、Linux、macOS)。

使用方法:

  • AOT 编译通常在构建或发布时启用,使用 dotnet publish 命令:

    bashCopy Code
    dotnet publish -c Release -r win-x64 --self-contained true /p:PublishAot=true
  • 适用于 Xamarin、.NET MAUI 等场景,也可以通过 mono(在某些情况下)实现 AOT 编译。

3. Self-contained Deployment(自包含部署)

适用环境:.NET Core 和 .NET 5+。

简介:
自包含部署指的是将应用程序及其所有依赖项(包括 .NET 运行时)一起打包,从而让应用在目标机器上独立运行,不依赖于已经安装的 .NET 运行时。通过这种方式,可以确保应用始终在一个已知的、经过优化的运行时环境中运行。

优点:

  • 部署和分发方便:所有必需的文件都包含在应用程序中,用户无需事先安装 .NET。
  • 避免运行时问题:由于应用程序和运行时被捆绑在一起,避免了依赖不兼容的 .NET 版本的问题。
  • 性能优化:通过构建特定平台的自包含部署包,能够减少 JIT 编译的开销并优化启动时间。

使用方法:

  • 在发布时选择自包含选项: bashCopy Code
    dotnet publish -c Release -r win-x64 --self-contained true
  • PS C:\Users\Administrator> dotnet publish -c Release -r win-x64 --self-contained true

    欢迎使用 .NET 9.0!
    ---------------------
    SDK 版本: 9.0.101

    遥测
    ---------
    .NET 工具会收集用法数据,帮助我们改善你的体验。它由 Microsoft 收集并与社区共享。你可通过使用喜欢的 shell 将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 "1" 或 "true" 来选择退出遥测。

    阅读有关 .NET CLI 工具遥测的更多信息: https://aka.ms/dotnet-cli-telemetry

    ----------------
    已安装 ASP.NET Core HTTPS 开发证书。
    若要信任该证书,请运行 "dotnet dev-certs https --trust"
    了解 HTTPS: https://aka.ms/dotnet-https

    ----------------
    编写第一个应用: https://aka.ms/dotnet-hello-world
    了解新增功能: https://aka.ms/dotnet-whats-new
    浏览文档: https://aka.ms/dotnet-docs
    报告问题并在 GitHub 上查找来源: https://github.com/dotnet/core
    使用 "dotnet --help" 查看可用命令或访问: https://aka.ms/dotnet-cli
    --------------------------------------------------------------------------------------
    MSBUILD : error MSB1003: 请指定项目或解决方案文件。当前工作目录中未包含项目或解决方案文件。

4. Trimming(代码修剪)

适用环境:.NET 5+、.NET 6+。

简介:
修剪(Trimming)是一个优化技术,用于在发布时移除不必要的程序集和代码,从而减小应用程序的大小并提高加载速度。这可以通过 .NET 6+ 的内置修剪功能来实现,它自动分析应用程序中未被使用的代码并将其剔除。

优点:

  • 减少应用程序大小:去除无用的代码和程序集,减小部署包的体积。
  • 提高启动速度:修剪后,程序加载时只需要加载和运行必要的部分,从而加速启动过程。

使用方法:

  • 在项目文件中启用修剪选项:

    xmlCopy Code
    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  • 然后使用 dotnet publish 发布应用程序:

    bashCopy Code
    dotnet publish -c Release -r win-x64 --self-contained true

5. Pre-compiling ASP.NET Core Applications

适用环境:ASP.NET Core。

简介:
ASP.NET Core 应用中,可以通过预编译 Razor 页面和控制器来加速请求处理时间。通常,ASP.NET Core 会在运行时动态编译 Razor 页面,但是预编译可以将其转换为 .NET 类,从而加速请求处理。

优点:

  • 提高请求处理性能:通过预编译 Razor 页面,减少了请求时编译的开销。
  • 更好的可维护性:预编译后的代码可以在发布时进行优化。

使用方法:

  • 可以通过在项目文件中启用 MvcRazorCompileOnPublish 来启用预编译: xmlCopy Code
    <PropertyGroup>
      <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
    </PropertyGroup>

6. Docker 镜像优化

适用环境:适用于通过 Docker 容器部署的 .NET 应用程序。

简介:
如果你在容器环境中运行 .NET 应用程序,可以通过优化 Docker 镜像来提高性能。例如,使用多阶段构建来减少镜像大小,并确保只包含运行时和所需依赖项。

优点:

  • 更小的容器镜像:通过多阶段构建减少镜像大小,减少容器启动时的开销。
  • 提高资源利用率:优化后的镜像加载更快,启动容器时可以提高性能。

使用方法:

  • 在 Dockerfile 中使用多阶段构建: dockerfileCopy Code
    FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
    WORKDIR /app
    EXPOSE 80
    
    FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
    WORKDIR /src
    COPY ["MyApp/MyApp.csproj", "MyApp/"]
    RUN dotnet restore "MyApp/MyApp.csproj"
    COPY . .
    WORKDIR "/src/MyApp"
    RUN dotnet build "MyApp.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "MyApp.dll"]

 

这些方法都可以在不同的场景下提高 .NET 应用程序的性能和启动速度。选择合适的优化方案需要根据你使用的 .NET 版本、部署方式以及具体应用场景来决定。例如,NGEN 适用于传统的 .NET Framework,而 ReadyToRun、AOT 和修剪则更适用于 .NET Core 和 .NET 5+ 版本。

标签:启动,NGEN,程序,应用程序,编译,dotnet,NET
From: https://www.cnblogs.com/suv789/p/18619986

相关文章

  • springboot毕设 中华传统文化学习平台 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球化日益加深的今天,中华传统文化作为中华民族的瑰宝,不仅承载着丰富的历史底蕴,更蕴含着深邃的哲学思想与人文精神。然而,随着科技的飞速发展和生活......
  • springboot毕设 酒店综合服务程序+论文
    系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,酒店作为旅游产业链中的重要一环,其服务质量与综合功能的完善程度直接影响着游客的旅行体验。在当今竞争激烈的市场环境中,酒店不仅需要提供舒适的住宿环境,还需通过多元化的服务来满足不同游客的个性化需求。因此,构......
  • springboot毕设 旅行分享系统程序+论文
    系统程序文件列表开题报告内容研究背景随着全球化的加速发展和人们生活水平的提高,旅行已成为现代人休闲娱乐、拓宽视野的重要方式之一。在信息化时代背景下,旅行信息的获取与分享变得尤为重要。当前市场上虽然已存在众多旅行服务平台,但大多数平台侧重于提供单一的预订服务或......
  • python毕设基于架构的信息发布系统管理和运维的实现ahh5z程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展,信息传播已成为企业运营中不可或缺的一部分。无论是大型企业还是初创公司,都需要一个高效、稳定的信息发布系统来宣......
  • python毕设基于学生学情管理系统的设计与实现a5ezy程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育信息化的不断深入,学生学情管理成为高校教育管理工作中的重要一环。传统的学生学情管理方式往往依赖于纸质记录、人工统计,不仅效率......
  • 微信小程序消息订阅
    摘要:最近做项目用到微信小程序消息订阅,但是微信官方文档描述的太官方了,好多地方不理解,查阅了好多资料结合官方文档总结一下需要注意的地方 使用到的API:订阅消息APIwx.requestSubscribeMessage(options)获取设置APIwx.getSetting({withSubscriptions:true})打开设置API<but......
  • 集智书童 | 从RAW到RGB的完美转换:RealCamNet 端到端摄像头成像 Pipeline 提升成像性能
    本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。原文链接:从RAW到RGB的完美转换:RealCamNet端到端摄像头成像Pipeline提升成像性能!近年来,神经摄像头成像管线的最新进展表明取得了显著的进步。然而,实际成像Pipeline仍然面临包括系统组件缺乏联合优化、计算......
  • python毕设 理发预约系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于理发预约系统的研究,现有研究多集中在通用的预约系统开发或大型服务行业预约系统的优化方面,专门针对理发行业的预约系统研究较少。......
  • uni-app微信小程序GPS位置获取爬坑
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,现在所在公司项目有抖音、快手、微信、支付、APP端,就是使用uni-app来开发的。坑位最近接手的项目是需要在下单前获取用户所有位置的GPS信息,再服务端会根......
  • 如何在C#.NET中使用LINX(arduino的LabView库)
    思路:使用LabView的导出为.NET互操作程序集,导出COM给.NET调用在LabView安装HubMaker插件,将预编译固件刷入Arduino设备中。这不是本文的重点,省略根据需要,编写VI。注意:必须在此处使用全局变量或者其它方法避免LinxResource簇在C#中出现,否则在程序运行时有概率出现堆损坏。导出......