日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

.Net8頂級性能優化:類型轉換

來源: 責編: 時間:2023-11-06 17:19:51 301觀看
導讀1.前言.Net8通過各種騷操,把性能提升到了前所未有的高度。超越以往任何版本,也涵蓋了后續版本,比如.NET9或許可能沒有如此大的性能優化了。本篇來看下它其中的一個優化:類型轉換的優化效果。2.示例通過類型檢查的優化,優

1.前言

.Net8通過各種騷操,把性能提升到了前所未有的高度。超越以往任何版本,也涵蓋了后續版本,比如.NET9或許可能沒有如此大的性能優化了。本篇來看下它其中的一個優化:類型轉換的優化效果。vm328資訊網——每日最新資訊28at.com

2.示例

通過類型檢查的優化,優化掉某些情況下類型轉換的時候JIT類型檢查的函數。下面的代碼是類型檢查的典型應用。vm328資訊網——每日最新資訊28at.com

[HideColumns("Error", "StdDev", "Median", "RatioSD")][DisassemblyDiagnoser(maxDepth: 0)]public class Tests{  private readonly string[] _strings = new string[1];  [Benchmark]  public string Get1() => _strings[0];  [Benchmark]  public string Get2() => Volatile.Read(ref _strings[0]);}public partial class Program{   static void Main(string[] args)   {     BenchmarkSwitcher.FromAssembly(typeof(Tests).Assembly).Run(args);   }}

我們看到_strings是個私有數組,Get1函數中獲取_strings數組的第一個值。所以它是直接用ldelem.ref IL執行即可vm328資訊網——每日最新資訊28at.com

ldelem.ref

但是Get2里面對數組元素進行了引用,所以Roslyn的指令是:vm328資訊網——每日最新資訊28at.com

ldelema [System.Runtime]System.String

如果ref類型的變量,被賦值為不同于這個變量的類型則會違反類型安全性。通常情況下ldelema需要進行類型檢查,也就是用JIT輔助函數CORINFO_HELP_LDELEMA_REF來進行檢查,以確保不會違反類型安全性。vm328資訊網——每日最新資訊28at.com

這個安全性的檢查會極大損耗性能,.NET8的JIT進行了一個優化,思路是如果是sealed關鍵字標記的類型,就不會進行安全性檢查,這樣就會提高性能。為什么sealed不會呢?vm328資訊網——每日最新資訊28at.com

這其實是利用了它的一個特性,就是不會被繼承。不會被繼承,就不會被子類的類型所困擾,只有string一個類型,自然不會用以進行類型檢查了。vm328資訊網——每日最新資訊28at.com

vm328資訊網——每日最新資訊28at.com

這是第一點優化,下面看下。vm328資訊網——每日最新資訊28at.com

3.第一階優化

優化了類型安全檢查,縮短了編譯時間,提高了性能。來看下.Net7和.NET8的生成Get2函數的的不同點vm328資訊網——每日最新資訊28at.com

.Net7:vm328資訊網——每日最新資訊28at.com

Tests.Get2()       sub       rsp,28       mov       rcx,[rcx+8]       xor       edx,edx       mov       r8,offset MT_System.String       call      CORINFO_HELP_LDELEMA_REF       mov       rax,[rax]       add       rsp,28       ret; Total bytes of code 33

.Net7它這里有一個CORINFO_HELP_LDELEMA_REF進行安全性檢查。vm328資訊網——每日最新資訊28at.com

.Net8:vm328資訊網——每日最新資訊28at.com

; Tests.Get2()       sub       rsp,28       mov       rax,[rcx+8]       cmp       dword ptr [rax+8],0       jbe       short M00_L00       mov       rax,[rax+10]       add       rsp,28       retM00_L00:       call      CORINFO_HELP_RNGCHKFAIL       int       3; Total bytes of code 29

.Net8里它沒有了CORINFO_HELP_LDELEMA_REFvm328資訊網——每日最新資訊28at.com

因為string類型是sealed,它的原型如下:vm328資訊網——每日最新資訊28at.com

public sealed class String : IEnumerable<char>, IEnumerable, ICloneable, IComparable, IComparable<String?>, IConvertible, IEquatable<String?>{  //這里代碼省略}

JIT會判斷類型是否是sealed標志,如果是則不進行安全性檢查優化。vm328資訊網——每日最新資訊28at.com

雖然.Net8去掉了CORINFO_HELP_LDELEMA_REF,vm328資訊網——每日最新資訊28at.com

但是多了范圍的檢查CORINFO_HELP_RNGCHKFAIL,那它這個性能如何呢?vm328資訊網——每日最新資訊28at.com

我們來測試下:vm328資訊網——每日最新資訊28at.com

dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0

結果是:vm328資訊網——每日最新資訊28at.com

Method
vm328資訊網——每日最新資訊28at.com

Runtimevm328資訊網——每日最新資訊28at.com

Mean
vm328資訊網——每日最新資訊28at.com

Ratio
vm328資訊網——每日最新資訊28at.com

Code Size
vm328資訊網——每日最新資訊28at.com

Get2vm328資訊網——每日最新資訊28at.com

.NET 7.0vm328資訊網——每日最新資訊28at.com

1.0537 nsvm328資訊網——每日最新資訊28at.com

1.00vm328資訊網——每日最新資訊28at.com

33 Bvm328資訊網——每日最新資訊28at.com

Get2vm328資訊網——每日最新資訊28at.com

.NET 8.0vm328資訊網——每日最新資訊28at.com

0.2423 nsvm328資訊網——每日最新資訊28at.com

0.23vm328資訊網——每日最新資訊28at.com

29 Bvm328資訊網——每日最新資訊28at.com

我們看到同樣代碼,.Net8里面比.Net7的性能提升了5倍之多。vm328資訊網——每日最新資訊28at.com

4.第二階優化

承接上面,上面sealed去掉了類型檢查。vm328資訊網——每日最新資訊28at.com

然后在類型轉換的時候,一般的類型轉換JIT使用的是CastHelpers.ChkCastAny來進行。vm328資訊網——每日最新資訊28at.com

但是.Net8里面內聯了一個方法vm328資訊網——每日最新資訊28at.com

用以縮短CastHelpers.ChkCastAny的編譯時間,提高編譯的時間和程序的性能。vm328資訊網——每日最新資訊28at.com

using BenchmarkDotNet.Attributes;using BenchmarkDotNet.Running;using System.Runtime.CompilerServices;BenchmarkSwitcher.FromAssembly(typeof(Tests).Assembly).Run(args);[HideColumns("Error", "StdDev", "Median", "RatioSD")]public class Tests{    private readonly object _o = "hello";    [Benchmark]    public string GetString() => Cast<string>(_o);    [MethodImpl(MethodImplOptions.NoInlining)]    public T Cast<T>(object o) => (T)o;}

同樣的vm328資訊網——每日最新資訊28at.com

dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0

結果如下:vm328資訊網——每日最新資訊28at.com

Method
vm328資訊網——每日最新資訊28at.com

Runtime
vm328資訊網——每日最新資訊28at.com

Mean
vm328資訊網——每日最新資訊28at.com

Ratio
vm328資訊網——每日最新資訊28at.com

GetStringvm328資訊網——每日最新資訊28at.com

.NET 7.0vm328資訊網——每日最新資訊28at.com

3.018 nsvm328資訊網——每日最新資訊28at.com

1.00vm328資訊網——每日最新資訊28at.com

GetStringvm328資訊網——每日最新資訊28at.com

.NET 8.0vm328資訊網——每日最新資訊28at.com

1.198 nsvm328資訊網——每日最新資訊28at.com

0.40vm328資訊網——每日最新資訊28at.com

.Net8是三倍于.Net7的運行速度。去掉類型檢查+類型轉換的內聯,大幅度的提升效率,可見.Net8的性能優化確實不容小覷。vm328資訊網——每日最新資訊28at.com

參考如下:vm328資訊網——每日最新資訊28at.com

https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/

最后推薦下個人的CLR/JIT交流圈,里面有多篇個人編寫的高質量的原創欄目和文章。學習心得,項目經驗等。帶你進入.Net核心技術階層,脫離curd工程師范疇。vm328資訊網——每日最新資訊28at.com

vm328資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17278-0.html.Net8頂級性能優化:類型轉換

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go 與數據可視化:使用 Gonum 和 Plot 庫探索數據之美

下一篇: 攜程后臺低代碼平臺的探究與實踐

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息?!疤蕴?8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛?,F在,我們就開始今
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、&ldquo;Ringdoll戒之人形&rdquo;淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • OPPO Reno10 Pro英雄聯盟定制禮盒公布:薩勒芬妮同款配色夢幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新機,全系標配了超光影長焦鏡頭,是迄今為止拍照
Top 主站蜘蛛池模板: 慈利县| 南皮县| 都江堰市| 渝中区| 乾安县| 南川市| 普洱| 达拉特旗| 仪征市| 广平县| 安新县| 沽源县| 陆河县| 木兰县| 长顺县| 吉首市| 翁牛特旗| 唐河县| SHOW| 堆龙德庆县| 安康市| 雅安市| 淮安市| 韶关市| 新河县| 公主岭市| 龙州县| 城市| 宁强县| 扎兰屯市| 若尔盖县| 白朗县| 青龙| 合水县| 宣武区| 嘉黎县| 海南省| 永康市| 石河子市| 余庆县| 奎屯市|