.NET 9 New features-AOT相关的改进

news/2024/12/23 8:50:44/文章来源:https://www.cnblogs.com/tianqing/p/18622260

上一篇文章给大家介绍了

.NET 9 New features-JSON序列化

 本篇文章,研究分享一下关于AOT方面的改进

1. 什么是AOT

AOT(Ahead-of-Time)编译是一种在应用程序部署之前,将高级语言代码直接编译为本机机器代码的技术。

与传统的即时编译(Just-In-Time,JIT)不同,AOT 在应用程序运行之前完成编译过程,生成独立的可执行文件。这意味着应用程序在运行时无需依赖运行时环境进行代码转换,从而减少启动时间和运行时开销。

2. 为什么有AOT

AOT 的出现主要是为了解决以下问题:

  • 启动性能:由于应用程序已被编译为本机代码,AOT 消除了运行时编译的需求,从而显著减少应用程序的启动时间。

  • 运行时性能:通过提前编译,AOT 可以进行更深层次的优化,提高代码执行效率。

  • 平台兼容性:在某些不允许 JIT 编译的受限平台上,AOT 是唯一可行的解决方案。

  • 部署简化:AOT 生成的可执行文件不依赖于外部运行时,简化了部署过程,特别是在无法确保目标环境安装了特定运行时的情况下。

3. AOT能解决什么问题

AOT 编译可以有效解决以下问题:

  • 提高启动速度:由于无需在运行时进行编译,应用程序可以更快速地启动,提升用户体验。

  • 降低内存占用:AOT 编译的应用程序通常具有更小的内存占用,因为不需要加载完整的运行时环境。

  • 增强安全性:通过消除运行时编译,减少了潜在的攻击面,提高了应用程序的安全性。

  • 支持老旧系统:.NET 9 的 AOT 编译器支持在 Windows 7 和 Windows XP 等老旧系统上运行,拓展了应用程序的适用范围。

4. 如何使用AOT

      在 .NET 9 中,使用 AOT 编译应用程序的步骤如下:

  • 安装必要工具:确保已安装 .NET 9 SDK 和 Visual Studio 2022 预览版,并选择安装“使用 C++ 的桌面开发”和“.NET 桌面开发”工作负载。

  • 创建 AOT 项目:使用命令行创建新的 AOT 项目,例如:

    dotnet new webapiaot -o MyFirstAotWebApi
  • 配置项目文件:在项目文件(.csproj)中,添加以下属性以启用 AOT 编译:

    <PublishAot>true</PublishAot>
  • 发布应用程序:使用以下命令发布 AOT 编译的应用程序:

    dotnet publish -c Release
  • 运行可执行文件:在发布目录中,找到生成的可执行文件,直接运行即可。

     这里有一篇文章,专门介绍 ASP.NET Core support for Native AOT

     其中。解释了一下ASP.NET Core为什么使用AOT,

     使用 Native AOT 发布和部署应用程序具有以下优势:

  1. 最小化磁盘占用
    使用 Native AOT 发布时,会生成一个包含仅支持程序所需的外部依赖代码的单个可执行文件。减少的可执行文件大小带来的好处包括:

    1. 更小的容器镜像,例如在容器化部署场景中。
    2. 更快的部署时间,因为镜像体积较小。
  2. 减少启动时间
    Native AOT 应用程序启动时间较短,这意味着:

    1. 应用程序能够更快地准备好处理请求。
    2. 在需要从一个版本的应用迁移到另一个版本时,对容器编排器的部署表现更优。
  3. 降低内存需求
    Native AOT 应用程序的内存需求可能会降低,具体取决于应用程序的工作内容。较低的内存消耗可以带来:

    1. 更高的部署密度。
    2. 提升的可扩展性。

5. .NET 9 AOT的改进

  • 支持老旧系统:AOT 编译器现在支持在 Windows 7 和 Windows XP 等老旧系统上运行,拓展了应用程序的适用范围。
  • 性能提升:通过优化编译过程,AOT 编译后的应用程序在启动时间和执行效率方面都有显著提升。
  • 更广泛的平台支持:.NET 9 的 AOT 编译器扩展了对多种平台的支持,包括最新的 iOS、macOS 和 Android 操作系统。
  • 内联改进:在 .NET 9 中,AOT 编译器对线程本地静态数据的访问进行了内联优化,减少了指令数,提高了性能。
  • PGO 改进:动态按配置优化(PGO)在 .NET 9 中得到了扩展,能够分析更多代码模式,提高类型检查和强制转换的性能。

      然后,什么是内联改进?

内联是指编译器在调用函数时,将被调用的函数代码直接插入到调用点,从而减少函数调用的开销,提升执行效率。在 .NET 9 中,内联机制得到了增强,特别是在共享泛型和运行时查找方面。

示例说明:public T Add<T>(T a, T b) { return a + b; }

在之前的版本中,由于泛型方法的多态性,编译器可能无法有效地将其内联。而在 .NET 9 中,内联机制的改进使得即使是共享的泛型方法,也能在特定情况下被内联,从而减少运行时查找,提高性能。

然后,PGO改进有哪些?

按配置优化(Profile-Guided Optimization,PGO)是一种利用应用程序运行时的实际性能数据来指导编译器优化代码的技术。

       .NET 8 默认启用了动态按配置优化 (PGO)。 NET 9 扩展了 64 位 JIT 编译器的 PGO 实现,以分析更多代码模式。 启用分层编译后,64 位 JIT 编译器已将检测插入到你的程序中以分析其行为。 当它通过优化重新编译时,编译器会利用它在运行时构建的配置文件来做出特定于程序当前运行的决策。 在 .NET 9 中,64 位 JIT 编译器使用 PGO 数据来提高类型检查的性能。

以上是关于.NET AOT的研究分享。

 

周国庆

2024/12/23

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms报错The each() function is deprecated

打开报错提示文件对应的行数 把 while (list($key) = each($val)) 改成foreach ($val as $key => $value)扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修…

dedecms文章简介标签infolen控制字数的方法

方法一:底层标签 [field:description/] 改成 [field:infos/] 方法二: [field:description function=cn_substr(@me,66)/]扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

后台管理登陆一直显示管理员密码错误?

有时浏览器缓存或Cookie可能导致登录问题。清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器登录,排除浏览器相关问题。 1. 验证密码修改成功 如果你最近修改了密码,确保修改操作确实成功。通过主机提供商控制面板或直接在数据库中检查管理员用户的密码哈希值是否已…

网站被黑,现在登录后台密码错误。

处理网站被黑且后台密码错误的问题,建议按照以下步骤进行:确保安全立即断开受感染服务器的网络连接以防止进一步攻击。 检查是否有其他入口点(如FTP、SSH)也被攻破。评估损害审查日志文件(访问日志、错误日志等),确定入侵时间和方法。 使用文件完整性检查工具对比原始安…

网站后台显示用户名或密码错误,无法登录

当网站后台显示用户名或密码错误且无法登录时,可以按照以下逻辑步骤进行排查和处理:验证输入信息确认输入的用户名和密码是否正确,注意大小写敏感。 尝试使用其他已知正确的管理员账户登录。检查浏览器缓存和Cookie清除浏览器缓存和Cookie,或者尝试使用隐身模式或不同浏览器…

服务器重启后站点仍无法访问

服务器重启后,客户反馈网站仍然无法访问,应该如何处理? 答案:您好,建议您进行以下操作:检查网络连接: 断开并重新连接本地网络设备,确保网络畅通。 测试服务器端口: 测试80端口是否通畅,若仍无法访问,请提交工单至云服务器技术支持部门。非常感谢您的支持!由此给您…

域名状态为HOLD,如何解除?

问题:域名状态显示为HOLD,已经按要求上传资料并通过实名认证,但状态仍未更新。如何解除HOLD状态? 答案:您好,遇到域名状态为HOLD的情况,请联系域名管理机构或公安部电话专线(张警官),咨询申诉流程并说明情况。具体步骤如下:联系相关部门: 提供域名相关信息,申请解…

如何为域名及其二级域名添加HTTPS支持?

为域名及其二级域名添加HTTPS支持,可以按照以下步骤操作:购买SSL证书:选择合适的SSL证书类型(如单域名、通配符证书),并完成购买。 安装SSL证书:根据服务器类型(如Apache、Nginx),按照官方文档安装SSL证书。 配置强制HTTPS:在服务器配置文件(如.htaccess)中添加重…

当遇到无法删除FTP后台部分文件的问题时应采取哪些措施?

当您在尝试删除FTP后台中的某些文件时遇到了困难,这可能是由多种因素引起的。为了有效地解决问题,您可以按照以下步骤进行排查和处理:检查权限设置:首先要确认您是否拥有足够的权限来执行删除操作。有时候,文件夹或文件可能被设置了特定的访问权限,导致普通用户无法对其进…

为什么在切换PHP版本后插件仍然无法获取?

缓存问题:当您切换PHP版本时,服务器可能会保留之前的缓存文件,导致新版本的配置未能生效。建议您尝试清除服务器和浏览器的缓存,并重启Web服务器(如Apache或Nginx)以确保所有更改都已应用。配置文件未更新:某些情况下,即使您在控制面板中切换了PHP版本,实际的配置文件…

服务器不稳定,如何提高稳定性?

检查服务器资源使用情况:首先,建议您通过监控工具(如Zabbix、Prometheus等)实时查看服务器的CPU、内存、磁盘I/O等资源使用情况。如果发现某个资源接近满载,可能是导致不稳定的原因之一。可以通过优化代码、减少不必要的进程或增加硬件资源来缓解压力。优化应用程序性能:…

Yakit靶场-高级前端加解密与验签实战-全关卡通关教程

Yakit靶场-高级前端加解密与验签实战-全关卡通关教程,包括AES、RSA、SHA256等算法。一、前端验签-SHA256 本文作者为CVE-柠檬i CSDN:https://blog.csdn.net/weixin_49125123 博客园:https://www.cnblogs.com/CVE-Lemon 微信公众号:Lemon安全 绕过通过查看源代码可以看到key…