.NET 8 中的原生 AOT 编译

        原生 AOT(预先编译)是一项功能,允许开发者创建编译为原生代码的独立应用,该应用可在未安装 .NET 运行时的计算机上运行。此功能可带来诸多优势,例如最大限度地减少磁盘占用、减小可执行文件大小、缩短启动时间以及降低内存需求。

        本机 AOT 编译并不是 .NET 8 中的新功能。它是在 .NET 7 中首次引入的。

.NET 7 和 .NET 8 的 AOT 编译之间的区别是:

        • System.Text.Json 改进:.NET 8 增加了对更多类型、源生成、接口层次结构、命名策略、只读属性等的支持。

        • 性能新类型:.NET 8 引入了 FrozenDictionary、FrozenSet、SearchValues、CompositeFormat、TimeProvider 和 ITimer 等新类型,以提高应用程序性能。

        • System.Numerics 和 System.Runtime.Intrinsics 增强功能:.NET 8 增加了对 Vector512、AVX-512、IUtf8SpanFormattable、Lerp 等的支持。

        • System.ComponentModel.DataAnnotations 添加:.NET 8 为云原生服务添加了新的数据验证属性和新的 ValidateOptionsResultBuilder 类型。

        • 托管服务生命周期方法:.NET 8 为托管服务添加了新的方法,例如 StartAsync、StopAsync、StartBackgroundAsync 和 StopBackgroundAsync。
需要注意的是,ASP.NET Core 中并非所有功能目前都兼容原生 AOT。更多信息,请参阅原生 AOT 部署概述

如何在 .NET 8 中使用原生 AOT 编译

您可以<PublishAot>true</PublishAot>在项目 .csproj 文件中添加以启用本机 AOT 编译。

        对于新项目,您可以使用--aot参数创建它们。例如:dotnet new console --aot。
默认情况下,编译器会选择混合方法代码优化,但你可以在 .csproj 文件中指定优化偏好。你可以选择尺寸或者速度根据您的要求。

<OptimizationPreference>Size</OptimizationPreference>

或者

<OptimizationPreference>Speed</OptimizationPreference>

结果

        创建了一个简单的控制台应用程序来测试原生 AOT 编译。我使用了一个简单的控制台应用程序,该应用程序向控制台写入了 100 次“Hello World!”。我使用不同的优化偏好设置测试了该应用程序。我得到了以下结果:


尺寸
速度
.NET 8
(独立、单文件)
65938 千字节00.0051806 ~5毫秒
.NET 7 AOT(默认)4452 千字节00.0029823 ~2毫秒
.NET 8 AOT(默认)1242 千字节00.0028638 ~2毫秒
AOT(速度)1280 千字节00.0023838 ~2毫秒
AOT(尺寸)1111 千字节00.0025145 ~2毫秒

由于大多数现有库尚不支持 AOT 编译,因此我无法使用三方库,如:BenchmarkDotnet来测量性能。我使用了Stopwatch来测量性能。因此,性能结果可能不准确,但可以深入了解性能差异。

MAUI 中的 AOT 支持

现在,您可以在 .NET MAUI 中对类似 iOS 的目标框架使用原生 AOT 编译。您可以通过将以下内容添加<PublishAot>true</PublishAot>到项目 .csproj 文件,以完全相同的方式启用 AOT 编译。据 dotnet 团队称,使用 AOT 编译后,应用程序大小减少了 35%,启动时间减少了 28%,运行时性能也提升了 50%。

但是 MAUI AOT 编译存在一些限制。许多库仍然不支持 AOT 编译,并且某些平台特定的功能目前可能无法使用。

何时使用本机 AOT 编译?

当您需要优化 .NET 应用程序的速度和大小时,原生 AOT 编译非常有用。它对于需要快速启动时间和高效运行时性能的应用程序(例如移动应用或高性能计算应用程序)尤其有用。

然而,由于其目前的局限性,它可能并不适合所有项目。如果您的项目严重依赖不支持 AOT 编译的库,或者使用了尚未兼容 AOT 的平台特定功能,那么您可能需要暂时不要使用原生 AOT 编译,直到进一步改进。

在决定使用本机 AOT 编译之前,请务必考虑项目的具体需求和限制。

结论

原生 AOT 编译是一项很棒的功能,可以提升 .NET 应用程序的性能。它目前仍处于早期阶段,并非所有库都支持它。但这对于 .NET 的未来来说是一个良好的开端🚀

参考链接

本机 AOT 部署概述 - .NET | Microsoft Learn。https: //learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/

优化 AOT 部署。 https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/optimizing

.NET 8 中的新增功能 | Microsoft Learn。 https: //learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值