.NET8中使用AOT编译模式

  很惭愧,直到.NET9发布才知道有这么一个功能,一番搜索下发现在.NET7中就已经支持这个特性了,今天就在本地的.NET8环境下测试一下这个功能吧

首先新建一个项目

 

 

 如果没有勾选,或者是老项目也没有关系,我们右键项目,点击编辑项目文件,手动加入这一行

 接下来我们创建一个类随便写一个方法即可

1 public static string Traditional()
2 {
3     string Sample = Console.ReadLine() ?? "Hello, World! This is a test string.";
4     return Sample.Substring(7, 5);
5 }

然后在Program.cs中调用这个方法

1 using ConsoleApp;
2 
3 性能测试.Traditional();

然后点击发布

 哦侯,就报错了,AOT和单文件只能二选一

 那我们取消掉生成单个文件再发布一下

 还是报错,我们勾选上C++的桌面开发,然后安装试试

 安装完之后我们再来重新发布,一次过

 可以运行一下EXE文件,看到占用内存变小了,单纯只是不同编译模式的情况下少了几百KB,而且文件也少,它还可以单独运行,不依赖任何文件和环境

 然后我又用JIT编译发布了一份文件,对比一下运行占用内存和文件数量

 这里是JIT发布模式,一模一样的情况下,没有改任何代码,文件有几百个,只能和其他文件在同一目录下运行

 可见确实改善非常大,好了,简单的实操就是这样,接下来可以看一下理论知识

优点:

1. AOT 会生成一个自包含的应用程序,并且已提前 (AOT) 编译为本机代码。原生 AOT 应用程序具有更快的启动时间和更小的内存占用,因为代码已经预先编译成了本地机器码,减少了启动时的编译开销,这些应用可以在未安装 .NET 运行时的计算机上运行

2. 在某些情况下,AOT 编译可以优化应用程序的运行时性能。由于代码在发布前已经进行了优化编译,减少了运行时动态编译可能带来的性能波动。

3. 对于一些不支持 JIT 编译的环境(例如某些嵌入式系统或具有严格安全限制的环境),AOT 编译使得.NET 应用程序能够在这些环境中运行

4. 在开发过程中,如果已经确定了应用程序的主要运行场景,AOT 编译可以帮助提前发现一些潜在的性能问题和代码错误,因为编译过程会对代码进行严格的检查

5. 增加了反编译的难度,一般情况下是反编译不出来的,代码再也不用裸奔了

优点说完了,我们说说缺点:

1. 如果应用程序在运行时存在大量动态加载的类型或方法(例如通过反射加载),AOT 编译可能会导致这些动态特性的性能下降。因为 AOT 编译主要针对静态已知的代码,动态加载的部分可能需要额外的处理机制

2. AOT 编译会将程序代码全部编译成目标机器码,这会导致发布文件的大小显著增加。因为除了应用程序本身的代码外,还包含了所有依赖库的预编译代码

3. AOT 编译过程相对复杂,需要对整个应用程序的代码进行提前编译和优化,这会导致构建时间明显延长。对于大型项目或者频繁构建的开发场景,较长的构建时间会降低开发效率,增加等待时间

4. 与 JIT 编译相比,AOT 编译后的代码在调试时会遇到更多困难。因为代码已经预编译成机器码,调试工具可能无法像在 JIT 编译环境下那样方便地提供源代码级别的调试信息。这使得查找和解决代码中的问题(如运行时错误、逻辑错误)变得更加复杂

 

在.NET8平台下还不支持32位系统编译
PlatformSupported architectureNotes
Windows x64, Arm64  
Linux x64, Arm64  
macOS x64, Arm64  
iOS Arm64 Experimental support
iOSSimulator x64, Arm64 Experimental support
tvOS Arm64 Experimental support
tvOSSimulator x64, Arm64 Experimental support
MacCatalyst x64, Arm64 Experimental support
Android x64, Arm64 Experimental, no built-in Java interop

在最新的.NET9中已经支持32位系统编译了,而且很多地方做的很不错了,大家可以尝试一下

PlatformSupported architectureNotes
Windows x64, Arm64, x86  
Linux x64, Arm64, Arm  
macOS x64, Arm64  
iOS Arm64  
iOSSimulator x64, Arm64  
tvOS Arm64  
tvOSSimulator x64, Arm64  
MacCatalyst x64, Arm64  
Android x64, Arm64, Arm Experimental, no built-in Java interop
posted @ 2024-12-03 12:16  Core、陈  阅读(2400)  评论(0)    收藏  举报