初探.net Native AOT(上)
大家好啊,因?yàn)楦鞣N各樣的原因,已經(jīng)很久沒有更新了,主要是感覺自己水平太低了沒啥東西講的(其實(shí)是懶??)。
本文主要參考:
hez2010大佬的,通過 .NET NativeAOT 實(shí)現(xiàn)用戶體驗(yàn)升級(jí)https://zhuanlan.zhihu.com/p/353853076
nscript大佬的使用 C# 進(jìn)行AI工程開發(fā)-基礎(chǔ)篇(二):NativeAOThttps://zhuanlan.zhihu.com/p/638859407
文章對(duì)應(yīng)視頻不日后上傳。

回到今天的主題,什么是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.
根據(jù)微軟的文檔,native AOT生成一個(gè)經(jīng)過AOT編譯導(dǎo)原生代碼的獨(dú)立應(yīng)用,有更快的啟動(dòng)速度和更小的內(nèi)存占用,可以不用安裝.net運(yùn)行時(shí)即可運(yùn)行。
總得來說, native AOT有以下一些優(yōu)點(diǎn)
啟動(dòng)時(shí)間短
應(yīng)用體積小
內(nèi)存占用低
無需運(yùn)行時(shí)
防止反編譯
以僅輸出HelloWorld的控制臺(tái)程序?yàn)槔?/p>
| HelloWorld | Native AOT | ?JIT ? | JIT(Trim&Compress) |
|:----------:|:----------:|:------:|:------------------:|
| ? ?文件大小 ? ?| ? ? 3M ? ? | 66.8M ?| ? ? ? 10.3M ? ? ? ?|
| ? ?運(yùn)行時(shí)間 ? ?| ? 25.9ms ? | 81.5ms | ? ? ?127.4ms ? ? ? |
| ? ?內(nèi)存占用 ? ?| ? 22.86M ? | 35.86M | ? ? ? 32.20M ? ? ? |
注意: AOT并不意味著運(yùn)行快,有時(shí)運(yùn)行效率AOT < JIT
AOT不是銀彈,享受性能的優(yōu)勢(shì)也伴隨著開發(fā)上的限制
反射泛型不利
支持平臺(tái)有限
編譯時(shí)間增加
交叉編譯困難
NATIVE AOT適合的一些場(chǎng)景
Cloud、Serverless
代碼不公開防止反編譯
C-style SDK開發(fā)
某些特殊場(chǎng)景

Native AOT的使用
在.csproj設(shè)置中添加以下代碼
或者使用命令行參數(shù)-p:PublishAot=true
CLI發(fā)布
更激進(jìn)的裁剪策略
StripSymbols:去除調(diào)試符號(hào)到.pdb文件,很重要,不設(shè)置將帶來很大的體積。
InvariantGlobalization:不使用國際化。
以上兩個(gè)屬性基本必開,對(duì)項(xiàng)目影響較小。接下來的參數(shù)設(shè)置可能會(huì)導(dǎo)致程序無法按照預(yù)期工作,請(qǐng)謹(jǐn)慎設(shè)置。
IlcOptimizationPreference:`Speed/Size`,優(yōu)化偏好。
IlcFoldIdenticalMethodBodies:折疊相同字節(jié)的方法體,更小的體積,但導(dǎo)致stacktrace不可讀。
IlcGenerateStackTraceData:生成堆棧追蹤數(shù)據(jù)。
IlcTrimMetadata:裁剪反射元數(shù)據(jù),反射類型只在部分設(shè)置中可見。
IlcDisableReflection:禁用反射。
IlcSystemModule:禁用System.Private.CoreLib和其它庫的自動(dòng)引用。
處理泛型和反射
使用SourceGenerator代替反射在編譯時(shí)而非運(yùn)行時(shí)生成代碼
編寫rd.xml指導(dǎo)正確裁剪
這部分的內(nèi)容我們放在項(xiàng)目實(shí)例中進(jìn)行說明
