.Net Native Code

前言:

如有疏漏,请指正

AOT的改进型R2R

AOT:是进行第一次编译之后,把编译的结果存放在硬盘里,下次调用的时候,直接从硬盘里面读取这个结果。(存疑???)
R2R:这个东西是AOT的改进型,可以称之为AOT的预编译类型。也就是通过Roysln和RyuJit的结合把编译的结果放在动态链接库的Native Header项里面。此后每一次的调用,都会到Native Header里面去获取结果,而不经过繁琐的RyuJit。.

AOT

在项目文件csproject里面添加:<PropertyGroup>

<PublishAot>true</PublishAot></PropertyGroup>然后:

dotnet publish -r win-x64 -c Release

R2R

可以直接:dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
或者类似与上面AOT:
1.在项目文件里添加:<PropertyGroup>

<PublishReadyToRun>true</PublishReadyToRun></PropertyGroup>2.dotnet publish -c Release -r win-x64

缺陷

AOT缺陷:
本机AOT限制:
1.Assembly.LoadFile不能动态加载
2.System.Reflection.Emit()不能生成运行时代码
3.没有C++/CLI
4.没有内置 COM
5.编译的单个文件中,该文件已经被验证有不兼容特性。
6.运行的文件和发布的文件可能存在限制性警告
最新.NET 7中AOT限制
1.只能面向控制台类型应用程序
2.可能与某些运行时(CLR)库不兼容
3.有限的诊断支持 (调试和分析) 。
R2R的缺陷:
R2R会在运行的时候会对多次调用的方法进行复合R2R编译(其实是分层编译的变体),替换RuntimeFunctions索引属性beginAddress的函数入口点,导致了性能相对于Native Header里面的结果出现了最大化的提升。包含大量代码的大多数应用程序都会获得很大的性能增益,但是同时也要注意到具有少量代码的应用程序很可能不会获得显著改进。

可以看到R2R相对于AOT进步巨大,优势非常明显,主要体现在复合R2R能力上

微软的AOT如此的拖延和众多问题,如果有期待者建议放弃,可以试试R2R。微软可能放弃AOT,着力在R2R。毕竟放弃和创造是传统,如同.net framwork和.net core 。

Crossgen2

这个东西是已被删除的 Crossgen 的后继版本,Crossgen2 是用于提供预先 (AOT) 编译的工具,可改进应用的启动时间。Crossgen2 是用 C# (而不是 C++)编写的,可执行之前的版本无法实现的分析和优化。
实质上来说,R2R的继任版本就是Crossgen2。
从Crossgen(AOT) -> R2R -> Crossgen2
官方的说法是Crossgen2用C#写的,那么问题来了,这个性能成问题吗?