RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

.NET8極致性能優(yōu)化AOT

OSC開源社區(qū) ? 來源:OSC開源社區(qū) ? 2023-12-06 10:16 ? 次閱讀

前言

.NET8對于性能的優(yōu)化是方方面面的,所以AOT預(yù)編譯機(jī)器碼也是不例外的。本篇來看下對于AOT的優(yōu)化。

概述

首先要明確一個概念,.NET里面的AOT它是原生的。什么意思呢?也就是說通過ILC編譯器(AOT編譯器,參考:.Net 7 新編譯器 ILC 簡析)編譯出來的代碼是各個平臺上可以直接運(yùn)行的二進(jìn)制代碼。比如MacOS的二進(jìn)制,Linux二進(jìn)制等等。所以稱之為原生。

C#源碼被ILC編譯之后,生成了一個完全原生態(tài)代碼的可執(zhí)行文件。在執(zhí)行的時候不需要JIT來編譯任何東西,因為JIT已經(jīng)在ILC里面被充分利用過了。實際上AOT里面也沒有包含JIT。那么它如何優(yōu)化呢?只能是在ILC里面調(diào)用JIT的時候了。所以它這個優(yōu)化依然依靠JIT。.NET8里面優(yōu)化AOT的一個典型的例子,就是ASP.NET應(yīng)用程序在使用AOT的時候表現(xiàn)不錯,同時也降低了總成本。

在.NET8里面優(yōu)化AOT的一個重要的目標(biāo)就是減少AOT可執(zhí)行文件的大小,關(guān)于這點(diǎn)的效果。我們現(xiàn)在就可以看到

下面創(chuàng)建一個控制臺應(yīng)用程序

dotnet new console -o nativeaotexample -f net7.0

由于上面是通過.NET7.0創(chuàng)建的,我們把這個控制臺的csproj更改下

net7.0
改為
net7.0;net8.0

可以輕松的構(gòu)建.NET7.0或者.NET8.0的程序

繼續(xù)

...項中添加如下
true編譯成AOT文件

下面我們就可以通過dotnet publish發(fā)布它了,linux如下:

dotnet publish -f net7.0 -r linux-x64 -c Release

現(xiàn)在它生成了一個.NET7.0版本的獨(dú)立可執(zhí)行文件,可通過ls/dir 輸出目錄以查看生成的二進(jìn)制大小

12820K /home/stoub/nativeaotexample/bin/Release/net7.0/linux-x64/publish/nativeaotexample

這個大約是13M左右,我們再來看下.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的大小,這個優(yōu)化的力度不可不大啊。整整優(yōu)化了將近10倍的體積。這就是.NET8.0的優(yōu)化魔力。

但是優(yōu)化的情況遠(yuǎn)不止如此,比如說我們可以配置csproj使AOT的體積更小

csproj添加如下size表示要生成的AOT大小
Size

如果我們不需要全球化代碼和數(shù)據(jù),需要特定的代碼和數(shù)據(jù),并且使用不變模式,可以csproj添加如下選項

true

如果你不想在AOT異常的時候拋出堆棧,那么你也可以在csproj里面添加如下

false

重新通過dotnet publish net8.0發(fā)布了之后,它的體積還可以繼續(xù)減小

1248K /home/stoub/nativeaotexample/bin/Release/net8.0/linux-x64/publish/nativeaotexample

再次縮小了0.3M大小。

然而,你以為到此優(yōu)化就為止了嗎?并沒有,.NET8不僅對AOT編譯器內(nèi)部進(jìn)行了改進(jìn),而且還對單個庫也進(jìn)行了性能優(yōu)化和改進(jìn)。比如HttpClient。

當(dāng)然除了體積的優(yōu)化之外,還有其它的優(yōu)化,比如避免了在讀取靜態(tài)字段時的輔助調(diào)用,再比如BenchmarkDotNet 也是支持AOT化的,也就是性能測試上面的支持。我們可以只使用 --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;
}

上面代碼可以通過如下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

可以看到即使是性能測試的Benchmark,AOT優(yōu)化也是不放過的。

另外還值得一提的地方就是分層,因為AOT里面沒有分層的概念。但是即時編譯也就是不是AOT編譯的時候,一個方法從tier0提升到tier1,方法里面的靜態(tài)字段必須被初始化過了。AOT里面添加了一個快速路徑檢查字段是否初始化,避免一些不必要的開銷。

其它的一些改進(jìn),比如AOT鎖的實現(xiàn)方式。使用了一種混合方式,開始使用輕量級自旋鎖,后面升級到使用 System.Threading.Lock 類型,這個應(yīng)該會在.NET9.0里面釋放出來。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    795

    瀏覽量

    41643
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3785

    瀏覽量

    80999
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68518
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49107

原文標(biāo)題:.NET8極致性能優(yōu)化AOT

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式開發(fā)極致性能優(yōu)化案例

    我們之前進(jìn)行了TFT刷屏測試確認(rèn)了基本功能。刷屏速度是決定GUI顯示幀率最根本的一環(huán),只有優(yōu)化極致的刷屏速度,才能有基礎(chǔ)實現(xiàn)更好效果的GUI。本篇就進(jìn)行刷屏的優(yōu)化,其實其思想是通用的,對于其他代碼也可以參考。
    的頭像 發(fā)表于 06-08 11:06 ?1314次閱讀
    嵌入式開發(fā)<b class='flag-5'>極致</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>案例

    .NET8性能優(yōu)化之線程

    目前來說,沒有確切的證據(jù)證明哪個線程池好用,或者效率更高。但是開發(fā)者可以使用上面的選項來進(jìn)行自己的選擇,有一個測試就是在Windows線程池在比較大的機(jī)器上的IO擴(kuò)展性不太好。如果你的應(yīng)用程序已經(jīng)大量的使用了Windows線程池,那么可以通過以上設(shè)置為另一個線程池操作也是可以的。此外,線程池經(jīng)常被阻塞,Windows線程池對此有更多的處理,也能更有效的比托管線程處理的更好。
    的頭像 發(fā)表于 01-22 14:50 ?1125次閱讀

    保時捷Panamera 2.9T艾森ECU升級:低功率晉級高功率,找回極致性能

    想要打造一款頂級的大型豪華GT跑車,有兩個重要因素:一個是極致舒適,另一個必須是極致性能。作為保時捷旗下經(jīng)典的掀背轎跑,新款Panamera 2.9T 集成了保時捷優(yōu)良的高貴血統(tǒng),只可惜保時捷將
    發(fā)表于 04-01 17:20

    《現(xiàn)代CPU性能分析與優(yōu)化》---精簡的優(yōu)化

    來提高程序的性能。由于這本書是Denis在easyperf.net博客分享內(nèi)容的系統(tǒng)整理和總結(jié)。更加偏向?qū)崙?zhàn)類型,在閱讀過程中,可以直接對自己的C/C++代碼進(jìn)行剖析和優(yōu)化實驗。當(dāng)然這本書也是有缺點(diǎn)
    發(fā)表于 04-18 16:03

    Oracle數(shù)據(jù)庫網(wǎng)絡(luò)安全訪問機(jī)制

    本文主要分析了Oracle 客戶端通過Net8 訪問數(shù)據(jù)庫服務(wù)器過程,闡述了Oracle 數(shù)據(jù)庫的網(wǎng)絡(luò)訪問機(jī)制以及Net8 在實現(xiàn)Oracle 數(shù)據(jù)庫的服務(wù)器和客戶端之間安全的數(shù)據(jù)通信中的重要作用。
    發(fā)表于 08-29 10:20 ?20次下載

    利用緩存技術(shù)優(yōu)化基于ASP.NET的Web GIS性能

    隨著Web GIS的快速發(fā)展和廣泛應(yīng)用,對Web GIS的性能提出了更高的要求。ASP.NET是微軟推出的新一代動態(tài)網(wǎng)頁技術(shù),它提供了強(qiáng)大的Web應(yīng)用開發(fā)功能,依托ActiveX技術(shù),開發(fā)基于ASP.NET的Web
    發(fā)表于 09-23 10:54 ?17次下載

    AOT412 datasheet

    The AOT412 and AOT412L is fabricated with SDMOSTM trench technology that combines excellent RDS
    發(fā)表于 09-28 13:38 ?11次下載
    <b class='flag-5'>AOT</b>412 datasheet

    WindowsCE_NET實時性能的測試與研究

    WindowsCE_NET實時性能的測試與研究
    發(fā)表于 10-25 09:26 ?4次下載
    WindowsCE_<b class='flag-5'>NET</b>實時<b class='flag-5'>性能</b>的測試與研究

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

    性能一直是華為非常專注的一個領(lǐng)域,華為通過HarmonyOS全棧的系統(tǒng)的技術(shù)加持和優(yōu)化,包括內(nèi)核層、硬件抽象層、runtime層、框架等等。各方面的努力,華為讓HarmonyOS的綜合性能比基于EMUI有了更大幅度的提升。
    的頭像 發(fā)表于 06-03 09:08 ?2493次閱讀
    HarmonyOS:<b class='flag-5'>極致</b><b class='flag-5'>性能</b>,全棧<b class='flag-5'>優(yōu)化</b>

    【專欄精選】嵌入式開發(fā)極致性能優(yōu)化案例

    做電子發(fā)燒友技術(shù)探索官,分享你的原創(chuàng)電子行業(yè)文章! 本期為大家?guī)硪黄度胧介_發(fā)性能優(yōu)化案例,感興趣的小伙伴可以關(guān)注作者一起學(xué)習(xí)哦~ 本期推 薦 專欄作者 : 嵌入式USB開發(fā) (點(diǎn)擊查看作者主頁
    的頭像 發(fā)表于 06-13 08:15 ?634次閱讀

    .NET 8發(fā)布首個RC,比.NET 7的超級快更快!

    此外,RC1 在 .NET MAUI 方面帶來了諸多質(zhì)量改進(jìn),修復(fù)內(nèi)存泄露和諸多特定平臺的問題,改進(jìn)了 UI 控制并優(yōu)化性能,在 Mac 上支持蘋果 Xcode 15。
    的頭像 發(fā)表于 09-18 16:54 ?1375次閱讀
    .<b class='flag-5'>NET</b> <b class='flag-5'>8</b>發(fā)布首個RC,比.<b class='flag-5'>NET</b> 7的超級快更快!

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

    ,它不需要運(yùn)行時,所有內(nèi)容都包含在一個文件中。 微軟介紹道,.NET 8 為原生 AOT 發(fā)布帶來了以下改進(jìn): 增加對 x64 和 macOS Arm64 架構(gòu)的支持 將 Linux 上原生
    的頭像 發(fā)表于 11-14 11:53 ?1434次閱讀
    .<b class='flag-5'>NET8</b>為原生<b class='flag-5'>AOT</b>改進(jìn) Linux上原生<b class='flag-5'>AOT</b>應(yīng)用程序大小最多減少50%

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

    發(fā)布容器映像,并且默認(rèn)情況下是非 root 的。由于 .NET 基礎(chǔ)映像更小,因此可以更快地部署容器化應(yīng)用程序 - 包括我們映像的新實驗變體,這些變體可為本機(jī) AOT 提供真正最小的應(yīng)用程序大小。
    的頭像 發(fā)表于 11-20 16:15 ?957次閱讀
    .<b class='flag-5'>NET</b> 8.0中有哪些新的變化?

    .NET8為什么要引入Non-GC Heap這種機(jī)制呢?

    .NET8里面JIT引入了一個新的機(jī)制,叫做Non-GC Heap。JIT可以確保相關(guān)對象分配在Non-GC Heap上,該堆像其名稱一樣,不受GC管理。
    的頭像 發(fā)表于 11-28 10:38 ?658次閱讀

    OPCUA產(chǎn)品情報:.NET SDK最新版本公布,系列產(chǎn)品穩(wěn)步更新中!

    近期,Unified Automation公司推出了.NET based OPC UA SDK v4.0.0這一產(chǎn)品。該版本除了例行的Bug修復(fù)外,還進(jìn)行了部分函數(shù)API的修改與功能的擴(kuò)展,新添了對使用MQTT/JSON傳輸?shù)腜ubSub模塊和.NET8的支持。
    的頭像 發(fā)表于 03-14 10:00 ?895次閱讀
    OPCUA產(chǎn)品情報:.<b class='flag-5'>NET</b> SDK最新版本公布,系列產(chǎn)品穩(wěn)步更新中!
    RM新时代网站-首页