欢迎光临散文网 会员登陆 & 注册

初探.net Native AOT(上)

2023-07-19 20:33 作者:HB_LW  | 我要投稿

大家好啊,因为各种各样的原因,已经很久没有更新了,主要是感觉自己水平太低了没啥东西讲的(其实是懒🐕)。

本文主要参考:

hez2010大佬的,通过 .NET NativeAOT 实现用户体验升级https://zhuanlan.zhihu.com/p/353853076

nscript大佬使用 C# 进行AI工程开发-基础篇(二):NativeAOThttps://zhuanlan.zhihu.com/p/638859407


文章对应视频不日后上传。

回到今天的主题,什么是Native AOT?

Publishing your app as native AOT produces an app that's self-contained and that has been ahead-of-time (AOT) compiled to native code. Native AOT apps have faster startup time and smaller memory footprints. These apps can run on machines that don't have the .NET runtime installed.

根据微软的文档,native AOT生成一个经过AOT编译导原生代码的独立应用,有更快的启动速度和更小的内存占用,可以不用安装.net运行时即可运行。

总得来说, native AOT有以下一些优点

  • 启动时间短

  • 应用体积小

  • 内存占用低

  • 无需运行时

  • 防止反编译

以仅输出HelloWorld的控制台程序为例

| HelloWorld | Native AOT |  JIT   | JIT(Trim&Compress) |
|:----------:|:----------:|:------:|:------------------:|
|    文件大小    |     3M     | 66.8M  |       10.3M        |
|    运行时间    |   25.9ms   | 81.5ms |      127.4ms       |
|    内存占用    |   22.86M   | 35.86M |       32.20M       |


注意: AOT并不意味着运行快,有时运行效率AOT < JIT


AOT不是银弹,享受性能的优势也伴随着开发上的限制

  • 反射泛型不利

  • 支持平台有限

  • 编译时间增加

  • 交叉编译困难

NATIVE AOT适合的一些场景

  • Cloud、Serverless

  • 代码不公开防止反编译

  • C-style SDK开发

  • 某些特殊场景

Native AOT的使用

在.csproj设置中添加以下代码


或者使用命令行参数-p:PublishAot=true


CLI发布

更激进的裁剪策略

  • StripSymbols:去除调试符号到.pdb文件,很重要,不设置将带来很大的体积。

  • InvariantGlobalization:不使用国际化。

以上两个属性基本必开,对项目影响较小。接下来的参数设置可能会导致程序无法按照预期工作,请谨慎设置。

  • IlcOptimizationPreference:`Speed/Size`,优化偏好。

  • IlcFoldIdenticalMethodBodies:折叠相同字节的方法体,更小的体积,但导致stacktrace不可读。

  • IlcGenerateStackTraceData:生成堆栈追踪数据。

  • IlcTrimMetadata:裁剪反射元数据,反射类型只在部分设置中可见。

  • IlcDisableReflection:禁用反射。

  • IlcSystemModule:禁用System.Private.CoreLib和其它库的自动引用。

处理泛型和反射

  1. 使用SourceGenerator代替反射在编译时而非运行时生成代码

  2. 编写rd.xml指导正确裁剪

这部分的内容我们放在项目实例中进行说明


初探.net Native AOT(上)的评论 (共 条)

分享到微博请遵守国家法律