.NET 8的AOT功能

从.NET 7开始,.NET平台多了AOT的功能。
这个功能从一出来我们差不多就在关注,但目前还没有真正使用到项目中去。

下面是我自己的理解,不一定都对或者准确。
.NET平台的话,按照原来的编译过程,并不会真正编译成真正的机器语言,而是先编译成中间语言,等到真正执行的时候,才会去编译成最终的机器语言。
所以.NET平台的应用运行基本上都是运行时的,这个应该跟Java这些差不多原理。

而现在新的AOT功能,相当于就是从一开始就把应用编译成目标的机器语言。

AOT的优点

1、应用的启动速度更快。因为传统的.NET应用,启动前有一个编译成机器语言的过程,而AOT跳过了这个过程。
2、不依赖于.NET运行时。原来的.NET应用,运行前机器上一定要先安装过对应的运行时,而且对版本还有要求。
3、用AOT编译的DLL文件可以直接给C++语言去调用。

AOT的局限

从.NET 7到.NET 8,AOT功能也做了升级,支持的功能和支持的平台上多了不少,但依赖有不少局限。
1、基本上只支持非图形界面应用,支持最好的应该是控制台应用,.NET 8新增了ASP.NET Core的支持。类似WPF和WinForm这些,目前都不支持AOT。
2、只支持x64和Arm64架构,不支持x86。我们的目标客户的电脑还有很多都是XP系统的,很多应用都需要支持XP系统的。

AOT的缺点

1、一些跟动态编译,反射相关的功能,要么不能用,要么有限制。
2、性能上会差一点。最开始了解AOT的启动速度快一点,想当然以为AOT的性能也会好一点。但据了解的情况,JIT方式的应用性能会更好一点。因为AOT从最开始就已经编译成机器语言了,所以有些东西就没办法做编译优化。而JIT方式的程序,在启动编译时,会根据目标机器的情况做针对性的优化编译处理。
3、类似一些System.Linq.Expressions的功能,AOT的方式会比JIT方式的更慢一点。

参考资料

https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?tabs=net7%2Cwindows

posted @ 2023-12-15 08:37  wzwyc  阅读(890)  评论(0编辑  收藏  举报