专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

在。Net7中性能改进常量折叠

  前言
  本文是PerformanceImprovementsin。NET7Folding(折叠),propagation(传播),andsubstitution(替换)部分的翻译。下面开始正文:原文地址:https:devblogs。microsoft。comdotnetperformanceimprovementsinnet7
  常量折叠是一种优化,编译器在编译时计算只涉及常量的表达式的值,而不是在运行时生成代码来计算值。在。Net中有多个级别的常量折叠,其中一些常量折叠由C编译器执行,另一些常量折叠由JIT编译器执行。例如给定C代码:〔Benchmark〕publicintA()3(45);〔Benchmark〕publicintB()A()2;
  C编译器将为这些方法生成IL代码,如下所示:。methodpublichidebysiginstanceint32A()cilmanaged{。maxstack8IL0000:ldc。i4。s23在编译时,由编译器计算值IL0002:ret}。methodpublichidebysiginstanceint32B()cilmanaged{。maxstack8IL0000:ldarg。0IL0001:callinstanceint32Program::A()调用方法A,可以看到没有常量折叠和常量传播IL0006:ldc。i4。2IL0007:mulIL0008:ret}
  您可以看到,C编译器已经计算出了3(45)的值,因为方法A的IL包含了等价的return23;但是,方法B包含等价的returnA()2;,强调C编译器执行的常量折叠只是在方法内部。下面是JIT生成的结果:Program。A()moveax,1717是十六进制,为十进制的23retTotalbytesofcode6Program。B()moveax,2E2E为十六进制,为十进制的46retTotalbytesofcode6
  方法A的汇编代码是不是特别有趣,它只是返回相同的值23(十六进制0x17)。但是方法B更有趣。JIT内联了从B到A的调用,将A的内容暴露给B,这样JIT就有效地将B的主体看作是等价于return232;此时,JIT可以完成自己的常量折叠,并将B的主体转换为简单地返回46(十六进制0x2e)。常量传播与常量折叠有着错综复杂的联系,本质上就是可以将常量值(通常是通过常量折叠计算的值)替换为进一步的表达式,此时它们也可以被折叠。
  JIT长期以来一直在执行常量折叠,但它在。NET7中得到了进一步改进。常量折叠可以改进的方法之一是公开更多要折叠的值,这意味着更多的内联。dotnetruntime55745帮助理解内联,像M(constantconstant)(注意这些常量可能是其他方法调用的结果)这样的方法调用本身就是将常量传递给M,而传递给方法调用的常量是对内联线的提示,它应该考虑更积极地内联,因为将该常量公开给被调用方的主体可能会显著减少实现被调用方所需的代码量。JIT之前可能已经内联了这样一个方法,但当涉及内联时,JIT都是关于启发式和生成足够的证据来证明内联是值得的;这有助于证明这一点。例如,该模式显示在TimeSpan上的各种FromXx方法中。例如TimeSpan。FromSeconds实现为:TicksPerSecondisaconstantpublicstaticTimeSpanFromSeconds(doublevalue)Interval(value,TicksPerSecond);
  并且,为了本例的目的,避免参数验证,Interval为:privatestaticTimeSpanInterval(doublevalue,doublescale)IntervalFromDoubleTicks(valuescale);privatestaticTimeSpanIntervalFromDoubleTicks(doubleticks)tickslong。MaxValue?TimeSpan。MaxValue:newTimeSpan((long)ticks);
  如果所有内容都内联,则FromSeconds本质上是:publicstaticTimeSpanFromSeconds(doublevalue){doubleticksvalue10000000;returntickslong。MaxValue?TimeSpan。MaxValue:newTimeSpan((long)ticks);}
  如果value是一个常量,比如5,那么这里就可以被折叠成常量(在tickslong。MaxValue分支上消除死代码)简单地:returnnewTimeSpan(50000000);
  为此,我将省去。Net6生成汇编代码,但在。Net7中,有这样一个基准测试:〔Benchmark〕publicTimeSpanFromSeconds()TimeSpan。FromSeconds(5);
  我们现在得到的是简单明了的汇编代码:Program。FromSeconds()moveax,2FAF0802FAF080为510001000retTotalbytesofcode6
  另一个改进常量折叠的更改包括SingleAccretion的dotnetruntime57726,它在特定的场景中消除了常量折叠,有时在对从方法调用返回的结构进行逐字段赋值时显示。作为一个小例子,考虑这个访问Color。DarkOrange属性,它会产生newColor(KnownColor。DarkOrange):〔Benchmark〕publicColorDarkOrange()Color。DarkOrange;
  在。Net6中,JIT生成如下代码:Program。DarkOrange()moveax,1movecx,39xorr8d,r8dmov〔rdx〕,r8mov〔rdx8〕,r8mov〔rdx10〕,cxmov〔rdx12〕,axmovrax,rdxretTotalbytesofcode32
  有趣的是,有些常量(39是KnownColor。DarkOrange常量值,1是私有StateKnownColorValid常量值)被加载到寄存器(moveax,1,然后movecx,39)中,然后被存储到返回的Color结构的相关位置(mov〔rdx12〕,ax和mov〔rdx10〕,cx)。在。NET7中,它现在生成:Program。DarkOrange()xoreax,eaxmov〔rdx〕,raxmov〔rdx8〕,raxmovwordptr〔rdx10〕,39movwordptr〔rdx12〕,1movrax,rdxretTotalbytesofcode25
  直接将这些常量值赋值到它们的目标位置(movwordptr〔rdx12〕,1和movwordptr〔rdx10〕,39)。其他变化贡献常量折叠包括dotnetruntime58171从SingleAccretion和dotnetruntime57605从SingleAccretion。
  然而,一个很大的改进类别来自与传播相关的优化,即前向替换。考虑一下这个不太好的基准测试:〔Benchmark〕publicintCompute1()ValueValueValueValueValue;〔Benchmark〕publicintCompute2()SomethingElse()ValueValueValueValueValue;privatestaticintValue16;〔MethodImpl(MethodImplOptions。NoInlining)〕privatestaticintSomethingElse()42;
  如果我们看一下在。Net6上为Compute1生成的汇编代码,它看起来就像我们所希望的那样。我们把Value相加了5次,Value被简单地内联并返回一个常量16,所以我们希望为Compute1生成的汇编代码能够有效地返回值80(十六进制0x50),这正是所发生的:Program。Compute1()moveax,50内联后为80(16进制是0x50)retTotalbytesofcode6
  但是Compute2生成汇编代码有点不同。代码的结构是这样的,对SomethingElse的额外调用最终会略微干扰JIT的分析,而。Net6最终会得到这样的汇编代码:Program。Compute2()subrsp,28callProgram。SomethingElse()addeax,1010为16进制16的值addeax,10addeax,10addeax,10addeax,10addrsp,28retTotalbytesofcode29
  而不是单个moveax,50将值0x50放入返回寄存器,分别为5个单独的addeax,10生成最终结果0x50(80)值。这个相加的过程是不理想。
  事实证明,JIT的许多优化操作的是作为解析IL的一部分创建的树数据结构。在某些情况下,当它们所操作的树更大,包含更多要分析的内容时,优化可以做得更好。但是,各种操作可以将这些树分解为更小的、单独的树,例如使用作为内联一部分创建的临时变量,这样做可以抑制这些操作。为了有效地将这些树组合一起,需要一些东西,那就是正向替换。你可以把正向替换想象成逆向的CSE(公共表达式消除);与尝试查找重复表达式并通过一次计算值并将其存储到临时值中来消除它们不同,正向替换消除了临时值,并有效地将表达式树移动到它的使用站点。显然,如果这样做会否定CSE并导致重复的工作,您就不希望这样做,但是对于只定义一次并使用一次的表达式,这种向前传播是有价值的。
  dotnetruntime61023添加了一个初始的有限版本的前向替换,然后dotnetruntime63720添加了一个更健壮的通用实现。随后,dotnetruntime70587对其进行了扩展,使其也涵盖了一些SIMD向量,然后dotnetruntime71161对其进行了进一步改进,以支持替换到更多的位置(在本例中为调用实参)。有了这些,我们的基准测试现在在。Net7中生成了以下代码:Program。Compute2()subrsp,28callqwordptr〔7FFCB8DAF9A8〕addeax,50在。Net6生成汇编代码,需要5次add相加操作,这里直接用5次相加的值addrsp,28retTotalbytesofcode18
  个人能力有限,如果您发现有什么不对,请私信我
  如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

蛋仔派对十月小蜜蜂来咯!新增瓶盖外观靓丽登场本文首发蛋仔攻略组公众号,未经授权禁止抄袭文章转载至其它平台。嘿嘿嘿大家好啊我是给大家带来蛋仔派对最新玩法攻略与最新资讯的好伙伴靓崽!蛋仔派对作为一款多人在线休闲竞争游戏,从公测到LOLS12小组赛DRX双杀GAM晋级八强,TES遗憾止步S12小组赛2022电竞季北京时间10月16日早上6点,2022全球总决赛小组赛C组下半场的第一局比赛由越南VCS一号种子GAM对阵LCK四号种子DRX!前期GAM中野双游上路越塔三抓一时被D巴基斯坦是什么鬼?凭什么叫巴铁?上世纪九十年代,随着苏联日渐式微,中美的蜜月期也即将结束,美国把打压的重点逐步转移到了中国。1990年的联合国大会上,美国牵头发起了制裁中国的提案,213个国家投了赞成票,迫于压力郝伟胆子太大了!宁愿鲁能后腰无人可用,都不让本土王牌首秀登场2022赛季对于泰山队当打指挥官陈科睿来说,注定是非常难熬的一个赛季。因为,陈科睿至今没有得到郝伟赏识,迎来2022赛季处子秀机会。之前,泰山队在后腰位置接连遇到了用人荒的问题。首男女比例失调影响有多大近日官方发布了2021年的中国新生儿男女比例已经下跌至108100,比十年前少了将近10。还有数据表示去年男性人口减少了49万,女性增加了94万。消息一出,迅速火爆网络。这意味着6新书从环境入手,用行为科学设计你的成功之路我在头条搞创作第二期你在意过自己身处的环境吗?不管是工作还是生活,我们有多少行为和情绪,受到了周遭环境的干扰?此刻,环视四周,你是否会有与行为决策相关的触发?在心理学研究领域,有一年内公募基金分红超1800亿元中国基金报记者张玲今年以来,市场震荡加剧,公募基金分红有条不紊。截至10月14日,基金年内分红总额超1800亿元,各类型产品中以债基分红最为慷慨。年内分红超1800亿元债基成分红主吸引力法则原理操作感恩你生命中所发生的一切都是你吸引来的,他们是被你心中所保持的心象吸引而来,他们就是你所想的,不论你心中想什么,你都会把他们吸引过来。吸引力法则的实现过程步骤一要求对宇宙下命令,让宇宙关注湖南省加快布局充电基础设施,2026年长沙充电桩将达4万个文懂车帝原创李帅飞懂车帝原创行业日前,湖南省发布了湖南省电力支撑能力提升行动方案(20222025年)(下文简称方案),其中强调引导居民优先购置新能源汽车,加快布局充换电基础设施。东方风起,科技跃迁,东风公司加速科技转型再攀新峰2022年8月27日晚,猛士汽车科技公司品牌战略发布会在武汉经开区举行,猛士MTerrainMTerrainS两款概念车同时亮相。至此,东风汽车集团有限公司(以下简称东风公司)拥有毫无诚意的纯电轿车!别克微蓝6新增车型为何不推荐买?当下新能源汽车市场飞速发展,电动车已经有了比肩甚至超越传统燃油车的产品实力,同时该类产品在售价方面越来越亲民,市场前景广阔。在新能源纯电动轿车产品中,别克微蓝6算是推出时间较早的一
出众质感,极致性能一加11优科技全面评测优科技评测室作为手机行业比较个性的品牌,一加手机一直都以高级的质感和出众的性能而备受好评,无论是当年引领行业90Hz高刷屏还是经典的三段式静音键,一加手机都是位于行业前列。加之在一人类主义再造西方与克敌之法美欧急于打碎旧世界,中国忙于重建新世界。若论重建家园再造社会,举世非中国莫属。美利坚是至今拒绝签署联合国禁止生化武器条约的唯一国家古今中外东西南北,物异人非而陌路殊途。天一生水,陆全球最脏的四条河,印度占一半,一条在中国,剩下一条在哪?底格里斯河和幼发拉底河流淌的水,隐藏着几千年前的古巴比伦文明尼罗河畔埃及法老的金字塔恒河里来自古印度文明的呼唤远上黄河白云间,奔涌而来的黄河之水是中华民族的五千年之源。纵观历史,古兰芳共和国历史迷雾中的华人共和国历史开讲公元1777年,这一年在当时的中国被称为乾隆四十二年,庞大的清帝国尚处于国力巅峰。在美洲大陆上,美国当时的首都费城被英军占领,这个前一年7月刚刚发布独立宣言的初生国家岌岌可西方世界的决定性会战基督教世界的瓦解(上)本文摘自英J。F。C。富勒著,小小冰人译西方世界的决定性会战第二卷封建制度下的欧洲进入了文艺复兴时期经院哲学衰落,而人文主义开始勃兴教皇变得过于世俗化,而帝国也在逐步衰落理性主义和寒冬,八路还一身单衣,团长正发愁,探马来报过来一个敌人车队1940年秋末,高粱玉米等高杆作物收割了,辽阔的豫北平原上,到处是光秃秃的一片。这样的地形,不仅给冀鲁豫新三旅七团的军事行动造成了困难,也因寒冷来得早,使部队上下为过冬棉衣问题而日大明首辅张居正张居正1582年6月19日夜,突然从噩梦中醒来的一代首辅张居正,厉声高叫。说不出话来,只能睁着一双空洞无神的眼睛,对着家人流泪。第二天,皇帝派人请教遗嘱时,尽国效忠一辈子的大明首辅西方人眼中的禁烟运动1关于林则徐领导的禁烟运动,我们知道的是本国人著述中的林则徐和他领导的禁烟运动,那么,西方人是怎样叙述这场中英冲突的呢?下面,我以美国人马士写的中华帝国对外关系史为基础,引用的文字,有故事的老道外(1)哈尔滨开埠之初只三个城区,南岗和道里区基本是洋人的居住地,而道外区没有被划入沙俄的势力范围,于是,这里成了中国居民的聚居地。哈尔滨人都把原来道外这个老城区,像老邻居般习惯与亲切的称用Python中的asyncio轻松进行异步编程构建快速且高效的应用程序异步编程在现代软件开发中变得越来越重要,Python的asyncio包提供了一组功能强大的工具,用于构建快速可扩展且高效的异步应用程序。在本文中,我们将探讨什么是asyncio它是云原生k8s离线部署讲解和实战操作一概述Kubernetes是一种高度可扩展的容器编排平台,可用于部署管理和自动化容器化应用程序的运行。在某些情况下,离线部署Kubernetes可能是必需的,例如在没有互联网连接的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网