前言
.NET8對(duì)于性能的優(yōu)化是方方面面的,所以AOT預(yù)編譯機(jī)器碼也是不例外的。本篇來(lái)看下對(duì)于AOT的優(yōu)化。
概述
首先要明確一個(gè)概念,.NET里面的AOT它是原生的。什么意思呢?也就是說(shuō)通過(guò)ILC編譯器(AOT編譯器,參考:.Net 7 新編譯器 ILC 簡(jiǎn)析)編譯出來(lái)的代碼是各個(gè)平臺(tái)上可以直接運(yùn)行的二進(jìn)制代碼。比如MacOS的二進(jìn)制,Linux二進(jìn)制等等。所以稱(chēng)之為原生。
C#源碼被ILC編譯之后,生成了一個(gè)完全原生態(tài)代碼的可執(zhí)行文件。在執(zhí)行的時(shí)候不需要JIT來(lái)編譯任何東西,因?yàn)镴IT已經(jīng)在ILC里面被充分利用過(guò)了。實(shí)際上AOT里面也沒(méi)有包含JIT。那么它如何優(yōu)化呢?只能是在ILC里面調(diào)用JIT的時(shí)候了。所以它這個(gè)優(yōu)化依然依靠JIT。.NET8里面優(yōu)化AOT的一個(gè)典型的例子,就是ASP.NET應(yīng)用程序在使用AOT的時(shí)候表現(xiàn)不錯(cuò),同時(shí)也降低了總成本。
在.NET8里面優(yōu)化AOT的一個(gè)重要的目標(biāo)就是減少AOT可執(zhí)行文件的大小,關(guān)于這點(diǎn)的效果。我們現(xiàn)在就可以看到
下面創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序
dotnet new console -o nativeaotexample -f net7.0
由于上面是通過(guò).NET7.0創(chuàng)建的,我們把這個(gè)控制臺(tái)的csproj更改下
net7.0 改為net7.0;net8.0
可以輕松的構(gòu)建.NET7.0或者.NET8.0的程序
繼續(xù)
把... 項(xiàng)中添加如下true 編譯成AOT文件
下面我們就可以通過(guò)dotnet publish發(fā)布它了,linux如下:
dotnet publish -f net7.0 -r linux-x64 -c Release
現(xiàn)在它生成了一個(gè).NET7.0版本的獨(dú)立可執(zhí)行文件,可通過(guò)ls/dir 輸出目錄以查看生成的二進(jìn)制大小
12820K /home/stoub/nativeaotexample/bin/Release/net7.0/linux-x64/publish/nativeaotexample
這個(gè)大約是13M左右,我們?cè)賮?lái)看下.NET8.0
dotnet publish -f net8.0 -r linux-x64 -c Release
生成的可執(zhí)行文件大小如下:
1536K/home/stoub/nativeaotexample/bin/Release/net8.0/linux-x64/publish/nativeaotexample
1.5M的大小,這個(gè)優(yōu)化的力度不可不大啊。整整優(yōu)化了將近10倍的體積。這就是.NET8.0的優(yōu)化魔力。
但是優(yōu)化的情況遠(yuǎn)不止如此,比如說(shuō)我們可以配置csproj使AOT的體積更小
csproj添加如下size表示要生成的AOT大小Size
如果我們不需要全球化代碼和數(shù)據(jù),需要特定的代碼和數(shù)據(jù),并且使用不變模式,可以csproj添加如下選項(xiàng)
true
如果你不想在AOT異常的時(shí)候拋出堆棧,那么你也可以在csproj里面添加如下
false
重新通過(guò)dotnet publish net8.0發(fā)布了之后,它的體積還可以繼續(xù)減小
1248K /home/stoub/nativeaotexample/bin/Release/net8.0/linux-x64/publish/nativeaotexample
再次縮小了0.3M大小。
然而,你以為到此優(yōu)化就為止了嗎?并沒(méi)有,.NET8不僅對(duì)AOT編譯器內(nèi)部進(jìn)行了改進(jìn),而且還對(duì)單個(gè)庫(kù)也進(jìn)行了性能優(yōu)化和改進(jìn)。比如HttpClient。
當(dāng)然除了體積的優(yōu)化之外,還有其它的優(yōu)化,比如避免了在讀取靜態(tài)字段時(shí)的輔助調(diào)用,再比如BenchmarkDotNet 也是支持AOT化的,也就是性能測(cè)試上面的支持。我們可以只使用 --runtimes nativeaot7.0 nativeaot8.0,而不使用 --runtimes net7.0 net8.0,如下代碼
// dotnet run -c Release -f net7.0 --filter "*" --runtimes nativeaot7.0 nativeaot8.0 using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; BenchmarkSwitcher.FromAssembly(typeof(Tests).Assembly).Run(args); [HideColumns("Error", "StdDev", "Median", "RatioSD")] public class Tests { private static readonly int s_configValue = 42; [Benchmark] public int GetConfigValue() => s_configValue; }
上面代碼可以通過(guò)如下AOT化運(yùn)行
dotnet run -c Release -f net7.0 --filter "*" --runtimes nativeaot7.0 nativeaot8.0
BenchmarkDotNet 輸出如下
Method | Runtime | Mean | Ratio |
---|---|---|---|
GetConfigValue | NativeAOT 7.0 | 1.1759 ns | 1.000 |
GetConfigValue | NativeAOT 8.0 | 0.0000 ns | 0.000 |
可以看到即使是性能測(cè)試的Benchmark,AOT優(yōu)化也是不放過(guò)的。
另外還值得一提的地方就是分層,因?yàn)锳OT里面沒(méi)有分層的概念。但是即時(shí)編譯也就是不是AOT編譯的時(shí)候,一個(gè)方法從tier0提升到tier1,方法里面的靜態(tài)字段必須被初始化過(guò)了。AOT里面添加了一個(gè)快速路徑檢查字段是否初始化,避免一些不必要的開(kāi)銷(xiāo)。
其它的一些改進(jìn),比如AOT鎖的實(shí)現(xiàn)方式。使用了一種混合方式,開(kāi)始使用輕量級(jí)自旋鎖,后面升級(jí)到使用 System.Threading.Lock 類(lèi)型,這個(gè)應(yīng)該會(huì)在.NET9.0里面釋放出來(lái)。
審核編輯:湯梓紅
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
803瀏覽量
42107 -
程序
+關(guān)注
關(guān)注
117文章
3819瀏覽量
82327 -
代碼
+關(guān)注
關(guān)注
30文章
4886瀏覽量
70186 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3321瀏覽量
58644 -
編譯器
+關(guān)注
關(guān)注
1文章
1653瀏覽量
49818
原文標(biāo)題:.NET8極致性能優(yōu)化AOT
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式開(kāi)發(fā)極致性能優(yōu)化案例

.NET8性能優(yōu)化之線程
保時(shí)捷Panamera 2.9T艾森ECU升級(jí):低功率晉級(jí)高功率,找回極致性能
《現(xiàn)代CPU性能分析與優(yōu)化》---精簡(jiǎn)的優(yōu)化書(shū)
Oracle數(shù)據(jù)庫(kù)網(wǎng)絡(luò)安全訪問(wèn)機(jī)制
利用緩存技術(shù)優(yōu)化基于ASP.NET的Web GIS性能
AOT412 datasheet

WindowsCE_NET實(shí)時(shí)性能的測(cè)試與研究

HarmonyOS:極致性能,全棧優(yōu)化

【專(zhuān)欄精選】嵌入式開(kāi)發(fā)極致性能優(yōu)化案例
.NET 8發(fā)布首個(gè)RC,比.NET 7的超級(jí)快更快!

.NET8為原生AOT改進(jìn) Linux上原生AOT應(yīng)用程序大小最多減少50%

.NET 8.0中有哪些新的變化?

.NET8為什么要引入Non-GC Heap這種機(jī)制呢?
OPCUA產(chǎn)品情報(bào):.NET SDK最新版本公布,系列產(chǎn)品穩(wěn)步更新中!

評(píng)論