当前位置:首页 > 科技  > 软件

.Net8顶级性能优化:类型转换

来源: 责编: 时间:2023-11-06 17:19:51 432观看
导读1.前言.Net8通过各种骚操,把性能提升到了前所未有的高度。超越以往任何版本,也涵盖了后续版本,比如.NET9或许可能没有如此大的性能优化了。本篇来看下它其中的一个优化:类型转换的优化效果。2.示例通过类型检查的优化,优

1.前言

.Net8通过各种骚操,把性能提升到了前所未有的高度。超越以往任何版本,也涵盖了后续版本,比如.NET9或许可能没有如此大的性能优化了。本篇来看下它其中的一个优化:类型转换的优化效果。lZd28资讯网——每日最新资讯28at.com

2.示例

通过类型检查的优化,优化掉某些情况下类型转换的时候JIT类型检查的函数。下面的代码是类型检查的典型应用。lZd28资讯网——每日最新资讯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执行即可lZd28资讯网——每日最新资讯28at.com

ldelem.ref

但是Get2里面对数组元素进行了引用,所以Roslyn的指令是:lZd28资讯网——每日最新资讯28at.com

ldelema [System.Runtime]System.String

如果ref类型的变量,被赋值为不同于这个变量的类型则会违反类型安全性。通常情况下ldelema需要进行类型检查,也就是用JIT辅助函数CORINFO_HELP_LDELEMA_REF来进行检查,以确保不会违反类型安全性。lZd28资讯网——每日最新资讯28at.com

这个安全性的检查会极大损耗性能,.NET8的JIT进行了一个优化,思路是如果是sealed关键字标记的类型,就不会进行安全性检查,这样就会提高性能。为什么sealed不会呢?lZd28资讯网——每日最新资讯28at.com

这其实是利用了它的一个特性,就是不会被继承。不会被继承,就不会被子类的类型所困扰,只有string一个类型,自然不会用以进行类型检查了。lZd28资讯网——每日最新资讯28at.com

lZd28资讯网——每日最新资讯28at.com

这是第一点优化,下面看下。lZd28资讯网——每日最新资讯28at.com

3.第一阶优化

优化了类型安全检查,缩短了编译时间,提高了性能。来看下.Net7和.NET8的生成Get2函数的的不同点lZd28资讯网——每日最新资讯28at.com

.Net7:lZd28资讯网——每日最新资讯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进行安全性检查。lZd28资讯网——每日最新资讯28at.com

.Net8:lZd28资讯网——每日最新资讯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_REFlZd28资讯网——每日最新资讯28at.com

因为string类型是sealed,它的原型如下:lZd28资讯网——每日最新资讯28at.com

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

JIT会判断类型是否是sealed标志,如果是则不进行安全性检查优化。lZd28资讯网——每日最新资讯28at.com

虽然.Net8去掉了CORINFO_HELP_LDELEMA_REF,lZd28资讯网——每日最新资讯28at.com

但是多了范围的检查CORINFO_HELP_RNGCHKFAIL,那它这个性能如何呢?lZd28资讯网——每日最新资讯28at.com

我们来测试下:lZd28资讯网——每日最新资讯28at.com

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

结果是:lZd28资讯网——每日最新资讯28at.com

Method
lZd28资讯网——每日最新资讯28at.com

RuntimelZd28资讯网——每日最新资讯28at.com

Mean
lZd28资讯网——每日最新资讯28at.com

Ratio
lZd28资讯网——每日最新资讯28at.com

Code Size
lZd28资讯网——每日最新资讯28at.com

Get2lZd28资讯网——每日最新资讯28at.com

.NET 7.0lZd28资讯网——每日最新资讯28at.com

1.0537 nslZd28资讯网——每日最新资讯28at.com

1.00lZd28资讯网——每日最新资讯28at.com

33 BlZd28资讯网——每日最新资讯28at.com

Get2lZd28资讯网——每日最新资讯28at.com

.NET 8.0lZd28资讯网——每日最新资讯28at.com

0.2423 nslZd28资讯网——每日最新资讯28at.com

0.23lZd28资讯网——每日最新资讯28at.com

29 BlZd28资讯网——每日最新资讯28at.com

我们看到同样代码,.Net8里面比.Net7的性能提升了5倍之多。lZd28资讯网——每日最新资讯28at.com

4.第二阶优化

承接上面,上面sealed去掉了类型检查。lZd28资讯网——每日最新资讯28at.com

然后在类型转换的时候,一般的类型转换JIT使用的是CastHelpers.ChkCastAny来进行。lZd28资讯网——每日最新资讯28at.com

但是.Net8里面内联了一个方法lZd28资讯网——每日最新资讯28at.com

用以缩短CastHelpers.ChkCastAny的编译时间,提高编译的时间和程序的性能。lZd28资讯网——每日最新资讯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;}

同样的lZd28资讯网——每日最新资讯28at.com

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

结果如下:lZd28资讯网——每日最新资讯28at.com

Method
lZd28资讯网——每日最新资讯28at.com

Runtime
lZd28资讯网——每日最新资讯28at.com

Mean
lZd28资讯网——每日最新资讯28at.com

Ratio
lZd28资讯网——每日最新资讯28at.com

GetStringlZd28资讯网——每日最新资讯28at.com

.NET 7.0lZd28资讯网——每日最新资讯28at.com

3.018 nslZd28资讯网——每日最新资讯28at.com

1.00lZd28资讯网——每日最新资讯28at.com

GetStringlZd28资讯网——每日最新资讯28at.com

.NET 8.0lZd28资讯网——每日最新资讯28at.com

1.198 nslZd28资讯网——每日最新资讯28at.com

0.40lZd28资讯网——每日最新资讯28at.com

.Net8是三倍于.Net7的运行速度。去掉类型检查+类型转换的内联,大幅度的提升效率,可见.Net8的性能优化确实不容小觑。lZd28资讯网——每日最新资讯28at.com

参考如下:lZd28资讯网——每日最新资讯28at.com

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

最后推荐下个人的CLR/JIT交流圈,里面有多篇个人编写的高质量的原创栏目和文章。学习心得,项目经验等。带你进入.Net核心技术阶层,脱离curd工程师范畴。lZd28资讯网——每日最新资讯28at.com

lZd28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17278-0.html.Net8顶级性能优化:类型转换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go 与数据可视化:使用 Gonum 和 Plot 库探索数据之美

下一篇: 携程后台低代码平台的探究与实践

标签:
  • 热门焦点
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top