吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

.NET8極致性能優化AOT

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

前言

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

概述

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

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

在.NET8里面優化AOT的一個重要的目標就是減少AOT可執行文件的大小,關于這點的效果。我們現在就可以看到

下面創建一個控制臺應用程序

dotnet new console -o nativeaotexample -f net7.0

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

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

可以輕松的構建.NET7.0或者.NET8.0的程序

繼續

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

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

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

現在它生成了一個.NET7.0版本的獨立可執行文件,可通過ls/dir 輸出目錄以查看生成的二進制大小

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

生成的可執行文件大小如下:

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

1.5M的大小,這個優化的力度不可不大啊。整整優化了將近10倍的體積。這就是.NET8.0的優化魔力。

但是優化的情況遠不止如此,比如說我們可以配置csproj使AOT的體積更小

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

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

true

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

false

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

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

再次縮小了0.3M大小。

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

當然除了體積的優化之外,還有其它的優化,比如避免了在讀取靜態字段時的輔助調用,再比如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化運行

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優化也是不放過的。

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    796

    瀏覽量

    41757
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81406
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69043
  • 應用程序
    +關注

    關注

    38

    文章

    3292

    瀏覽量

    57911
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49283

原文標題:.NET8極致性能優化AOT

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式開發極致性能優化案例

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

    .NET8性能優化之線程

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

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

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

    《現代CPU性能分析與優化》---精簡的優化

    來提高程序的性能。由于這本書是Denis在easyperf.net博客分享內容的系統整理和總結。更加偏向實戰類型,在閱讀過程中,可以直接對自己的C/C++代碼進行剖析和優化實驗。當然這本書也是有缺點
    發表于 04-18 16:03

    Oracle數據庫網絡安全訪問機制

    本文主要分析了Oracle 客戶端通過Net8 訪問數據庫服務器過程,闡述了Oracle 數據庫的網絡訪問機制以及Net8 在實現Oracle 數據庫的服務器和客戶端之間安全的數據通信中的重要作用。
    發表于 08-29 10:20 ?20次下載

    利用緩存技術優化基于ASP.NET的Web GIS性能

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

    AOT412 datasheet

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

    WindowsCE_NET實時性能的測試與研究

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

    HarmonyOS:極致性能,全棧優化

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

    【專欄精選】嵌入式開發極致性能優化案例

    做電子發燒友技術探索官,分享你的原創電子行業文章! 本期為大家帶來一篇嵌入式開發性能優化案例,感興趣的小伙伴可以關注作者一起學習哦~ 本期推 薦 專欄作者 : 嵌入式USB開發 (點擊查看作者主頁
    的頭像 發表于 06-13 08:15 ?700次閱讀

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

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

    .NET8為原生AOT改進 Linux上原生AOT應用程序大小最多減少50%

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

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

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

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

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

    OPCUA產品情報:.NET SDK最新版本公布,系列產品穩步更新中!

    近期,Unified Automation公司推出了.NET based OPC UA SDK v4.0.0這一產品。該版本除了例行的Bug修復外,還進行了部分函數API的修改與功能的擴展,新添了對使用MQTT/JSON傳輸的PubSub模塊和.NET8的支持。
    的頭像 發表于 03-14 10:00 ?979次閱讀
    OPCUA產品情報:.<b class='flag-5'>NET</b> SDK最新版本公布,系列產品穩步更新中!
    香港六合彩85期开奖结果| 百家乐官网连锁| 网络百家乐真假| 博彩论坛| 大发888真人新浪微群| 真人百家乐游戏软件| 百家乐官网平台租用| 做生意的好风水| 百家乐投注技巧球讯网| 太阳城网上娱乐城| 东方太阳城三期琴湖湾| 登封市| 百家乐平注常赢玩法| 网上百家乐官网作弊法| 百家乐赌术大揭秘| bet365娱乐城| 八卦24方位| 百家乐官网两边| 百家乐的玩法技巧和规则| 足彩大赢家| 百家乐视频游戏帐号| 台安县| 怎么赢百家乐的玩法技巧和规则 | 广发百家乐官网的玩法技巧和规则 | 澳门百家乐游戏说明| 百家乐官网2棋牌作弊软件| 百家乐官网固定打法| 英皇国际| 百家乐官网平注法口诀技巧| 杰克百家乐玩法| 莆田棋牌迷游戏中心| 永利百家乐官网赌场娱乐网规则| 皇城百家乐娱乐城| 蓝盾百家乐官网打法| 新锦江百家乐娱乐场| 御匾会百家乐官网的玩法技巧和规则| 百家乐官网必胜法hk | 百家乐官网如何取胜| 百家乐国际赌场娱乐网规则| 百盛百家乐官网软件| 太阳城娱乐开户|