百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

.NET9 PreView2的重磅功能(.net5新功能)

cac55 2024-10-11 11:03 15 浏览 0 评论




前言

.NET9 PreView2发布了,它的CLR方面主要有两个重磅功能

  • RyuJIT 增强功能

  • Arm64 矢量化

下面分别看下

RyuJIT增强功能

1.环路优化

这种优化实际上是一种for循环叠加态的优化,for循环叠加计算的过程中,会对其中部分变量进行感应。比如循环中放置0扩展(第一个索引为0),这种优化灵感来源于LLVM标量演化。下面看例子,说明下这个优化:

[MethodImpl(MethodImplOptions.NoInlining)]static int Foo(int[] arr){ int sum = 0; for (int i = 0; i < arr.Length; i++) { sum += arr[i]; }
return sum;}

未优化前:

G_M8112_IG01: sub rsp, 40 ;; size=4 bbWeight=1 PerfScore 0.25G_M8112_IG02: xor eax, eax xor edx, edx mov r8d, dword ptr [rcx+0x08] test r8d, r8d jle SHORT G_M8112_IG04 align [0 bytes for IG03] ;; size=13 bbWeight=1 PerfScore 3.75G_M8112_IG03: mov r10d, edx add eax, dword ptr [rcx+4*r10+0x10] inc edx cmp r8d, edx jg SHORT G_M8112_IG03 ;; size=15 bbWeight=4 PerfScore 19.00G_M8112_IG04: add rsp, 40 ret  ;; size=5 bbWeight=1 PerfScore 1.25
; Total bytes of code 37, prolog size 4, PerfScore 24.25, instruction count 14, allocated bytes for code 37 (MethodHash=d1cce04f) for method ConsoleApp34.Program:Foo(int[]) :int (FullOpts); ============================================================

未优化前37字节,优化后:

G_M8112_IG01: ;; offset=0x0000 sub rsp, 40 ;; size=4 bbWeight=1 PerfScore 0.25G_M8112_IG02: ;; offset=0x0004 xor eax, eax mov edx, dword ptr [rcx+0x08] test edx, edx jle SHORT G_M8112_IG04 xor r8d, r8d align [0 bytes for IG03] ;; size=12 bbWeight=1 PerfScore 3.75G_M8112_IG03: ;; offset=0x0010 add eax, dword ptr [rcx+4*r8+0x10] inc r8d cmp edx, r8d jg SHORT G_M8112_IG03 ;; size=13 bbWeight=4 PerfScore 18.00G_M8112_IG04: ;; offset=0x001D add rsp, 40 ret  ;; size=5 bbWeight=1 PerfScore 1.25
; Total bytes of code 34, prolog size 4, PerfScore 23.25, instruction count 13, allocated bytes for code 34 (MethodHash=d1cce04f) for method ConsoleApp34.Program:Foo(int[]) :int (FullOpts)

优化后34字节,减少了3字节,优化的指令如下,刚好三字节。这里的优化点是减却寄存器置零或者赋值(称之为放置0扩展),进行共用。

mov 41 89 d2 r10d, edx

2.NativeAOT改进:内联+TLS

这种优化,需要了解一些知识点。假如一个类成员被多个线程访问,一般的访问的时候会设置锁,以避免数据干扰。但是,这同时也产生性能问题。为了提高性能,可以把这个类成员放到线程本地存储(TLS)当中,访问的时候直接去线程本地存储获取,这样极大提高了性能。

但是这还不够,我们需要把访问类成员的代码进行内联。进一步提高性能,不然怎么能叫极致性能优化呢?

代码:

: 90000000 adrp x0, 0 <System_Console_System_ConsoleKeyInfo____GetFieldHelper> 5a2f0: R_AARCH64_TLSDESC_ADR_PAGE21 tls_InlinedThreadStatics 5a2f4: 91000000 add x0, x0, #0x0 5a2f4: R_AARCH64_TLSDESC_ADD_LO12 tls_InlinedThreadStatics 5a2f8: d53bd041 mrs x1, tpidr_el0 5a2fc: f9400002 ldr x2, [x0] 5a2fc: R_AARCH64_TLSDESC_LD64_LO12 tls_InlinedThreadStatics 5a300: d63f0040 blr x2 5a300: R_AARCH64_TLSDESC_CALL tls_InlinedThreadStatics 5a304: 8b000020 add x0, x1, x0 5a308: f9400013 ldr x19, [x0]

2.PGO的改进:类型检查

PGO是.NET8的一大亮点,启用了动态配置文件引导优化 (PGO)。.NET9 Pre2扩展了PGO,以便分析更多的代码模式。启用分层编译后,RyuJIT 已经将检测插入到程序中以分析其行为;在使用优化重新编译时,RyuJIT 利用它在运行时构建的配置文件来做出特定于程序当前运行的决策。在预览版 2 中,RyuJIT 现在默认使用 PGO 数据来提高类型检查的性能。

一般来说,确定对象的类型需要调用运行时。这会带来一些性能上的损失,也就是说当进行类型检查的时候,运行时为了确保类型正确性,必须进行检查。通过.NET8里面启用的PGO,如果在PGO里面能够确定对象是某个类型,JIT就会用一个快速路径编码,以比较快速的方式进行类型检查。并且在必要的时候退回到慢速路径(常规检查)

bool IsList<T>(IEnumerable<T> source) => source is IList<T>;

如果PGO检测到source总是数组,则会快速路径返回true,否则慢速路径进行检测

if (source is int[]){ return true;}else{ return slow_path(); // Let the runtime figure it out}

ARM64矢量化

.NET9 Pre2支持了一种新的实现,利用JIT在Arm64上操作寄存器的加载和存储的能力。简单点来说,就是用SEE,YMM等一次性操控32字节或者64字节的寄存器处理更大量的数据,提升性能。



相关推荐

PDF转Excel后,转出的表格全是乱码是怎么回事?

日常工作中经常会用到将各种办公文档不同格式进行互转,比如将PDF转成Excel,这种转换非常简单,工具也很多,但是有时PDF文档是正常的,转出来的表格却全是乱码是怎么回事呢?在PDF转Excel时,你...

Python CSV 模块通关秘籍:数据表格处理不求人

对话实录小白:(苦恼)我导出的CSV用Excel打开全是乱码!专家:(递上秘籍)(掏出魔法书)**编码问题!用utf-8-sigma保存!CSV格式初体验CSV后缀的文件是标准文件格式,可以通过文本编...

ArcMap碎碎念(常见使用问题集锦)(arcgis细碎小班)

这几日,由于工作原因,频繁使用ArcMap,期间也碰到了些许问题,因而攒了这篇文章,以作记录。1.数据转换:mxd转mpk格式后缀为mxd的文件类型在ArcGIS的使用过程中较为常见,也即为常见的地图...

Excel常用技能分享与探讨(4-经常遇到的问题点汇总②)

一、文件异常问题Excel文件损坏无法打开现象:提示“文件已损坏”“无法读取内容”或直接闪退。解决:使用【文件】→【打开】→选择文件→点击右下角【打开】下拉箭头→选择【打开并修复】。若失败,尝...

解决Excel“#”乱码的方法来了(excel表格嵌入图片别人打开是乱码怎么解决)

小编本人是个表格控,没有excel可能分分钟就会焦虑,刚用excel大概半年多的时间,随着数据传递的频繁和增多,发现了一个奇怪的问题。做好的表格保存后再打开会变成“###”还有时,会出现这样的日期这时...

如何修复损坏的 Excel 文件?3 个方法救回重要数据

有没有遇到这种情况:打开Excel提示“文件已损坏,无法打开”明明很重要的数据,却打不开了…别急!今天分享3个实用方法,帮你修复Excel文件,拯救重要数据!方法一:用Excel自带...

为什么你的 GIS 数据总是出现乱码?

你肯定遇到过这种情况:把GIS文件拖进BigemapPro,但为啥文字就变成了乱码?例如这样:遇到这种情况呢,你也别急,我来教你怎么处理。一、三调数据文件乱码我们通常拿到的三调数据文件是GDB格式的,...

Excel表格数字乱码怎么办?推荐四种简单方法

我们经常利用Excel表格录入数据,在录入数据的时候我们经常会遇到这种情况:因为录入的数字的数位较多导致数字乱码。这种情况真的很影响我们的工作进程。那么Excel表格数字乱码该怎么办呢?推荐大家使用这...

使用Excel时经常遇到的问题,别担心,轻松告诉你解决方案

Excel打开CSV文件为乱码的解决方法!Excel中外部数据链接无法删除怎么办?Excel打开CSV文件为乱码的解决方法!从网页上导出数据文件存储为CSV格式的文件,使用记事本打开文字显示没有问题,...

解决数据恢复软件——恢复的excel文件乱码问题

恢复的excel文件出现乱码通常与原始文件损坏有关,为了解决数据恢复后excel乱码问题,建议使用数据恢复软件的深度恢复扫描,再次扫描需要恢复的excel文件所在磁盘,该扫描方式能对硬件设备进行碎片文...

Excel表格中怎么删除乱码?一秒搞定

随着我们越来越多的使用Excel,我们会发现很多情况下Excel会返回一串乱码似的字符。这些其实并不是乱码。Excel执行公式运算时都会自动对单元格中输入的公式进行检查,当公式如果不能正确地计算时返回...

EXCEL打开CSV等数据文件是乱码怎么办?

使用Data.olllo数据助手解决EXCEL打开CSV、TXT数据乱码的问题计算机存储的文件是有不同的编码方式,而有时候EXCEL打开CSV或TXT文件的时候,发现是乱码,这时候应该怎么办呢?工具:...

Excel表格出现乱码,怎么办?只需要7步,就能完美解决问题

当打开表格时出现乱码,首先需要检查文件的编码格式,确认文件编码格式是否与本地编码格式一致。如果编码格式不一致,可以在打开表格时选择正确的编码格式。如果不确定编码格式,可以试着把文件保存为ANSI或者...

我的Excel打开后是一堆乱码,如何解决?

Excel文件内容变成乱码,可能由于文件编码、文件格式或Excel程序设置的问题导致。以下是一些有效的解决方案,可以帮助你解决Excel乱码问题1.确认文件编码是否正确如果文件是从外部导入的(例如C...

Excel文件打开乱码问题解决方法详解

在日常办公或数据处理中,Excel文件是极为常用的工具。然而,有时当我们尝试打开一个Excel文件时,可能会遇到内容显示为乱码的情况,这不仅影响工作效率,还可能导致重要数据的丢失或损坏。本文将详细介绍...

取消回复欢迎 发表评论: