首页 > 其他分享 >.Net7基础类型的优化和循环克隆优化

.Net7基础类型的优化和循环克隆优化

时间:2023-06-13 18:55:07浏览次数:63  
标签:short 克隆 int M00 Net7 优化 rax ecx

前言

.Net7里面对于基础类型的优化,是必不可少的。因为这些基础类型基本上都会经常用到,本篇除了基础类型的优化介绍之外,还有一个循环克隆的优化特性,也一并看下。


概括

1.基础类型优化
基础类型的优化不会有些不会涉及ASM,主要是记忆。
一:double.Parse和float.Parse,把某数值转换成double或者float类型,这两个Parse进行了优化。
二:bool.TryParse和bool.TryFormat也进行了性能优化。
假如说有以下代码:

destination[0] = 'T';
destination[1] = 'r';
destination[2] = 'u';
destination[3] = 'e';

四次写操作,写入到destination数组。这个可以一次性写入(单个ulong)来进行性能优化,基准不测:

BinaryPrimitives.WriteUInt64LittleEndian(MemoryMarshal.AsBytes(destination), 0x65007500720054); // "True"
0x65007500720054是内存地址,里面存放了四个char的值。

private bool _value = true;
private char[] _chars = new char[] { 'T', 'r', 'u', 'e' };

[Benchmark] public bool ParseTrue() => bool.TryParse(_chars, out _);
[Benchmark] public bool FormatTrue() => _value.TryFormat(_chars, out _);

三:Enum枚举也进行了性能优化
这里主要是二进制算法和线性算法的综合应用,因为当我们执行枚举的一些方法,比如Enum.IsDefined、Enum.GetName或Enum.ToString的时候。它会搜索一些值,这些值也是存储在数组中的,会使用Array.BinarySearch二进制来搜索。涉及到复杂的算法的时候Array.BinarySearch二进制搜索是可以的,但是如果比较简单的算法则用它相当于杀鸡用牛刀,这里就引入了线性搜索:SpanHelpers.IndexOf。那么何时用线性何时用二进制搜索呢?对于小于或等于32个定义值的枚举用线性,大于的用二进制。
代码如下,benchmark这里就不打印出来了

private DayOfWeek[] _days = Enum.GetValues<DayOfWeek>();
[Benchmark]
public bool AllDefined()
{
    foreach (DayOfWeek day in _days)
    {
        if (!Enum.IsDefined(day))
        {
            return false;
        }
    }

    return true;
}

Enums在与Nullable和EqualityComparer.Default的配合下也得到了性能提升,因为EqualityComparer.Default缓存了一个从所有对Default的访问中返回的EqualityComparer实例,EqualityComparer.Default.Equals根据它这个里面的T值来确保了nullable enums被映射到(现有的)Nullable的专门比较器上,并简单地调整了其定义以确保它能与enums很好地配合。
代码如下,Benchmark不测

private DayOfWeek?[] _enums = Enum.GetValues<DayOfWeek>().Select(e => (DayOfWeek?)e).ToArray();
[Benchmark]
[Arguments(DayOfWeek.Saturday)]
public int FindEnum(DayOfWeek value) => IndexOf(_enums, value);
private static int IndexOf<T>(T[] values, T value)
{
    for (int i = 0; i < values.Length; i++)
    {
        if (EqualityComparer<T>.Default.Equals(values[i], value))//这里的T值是IndexOf传过来的,进行的一个性能优化
        {
            return i;
        }
    }

    return -1;
}

四:Guid的优化
Guid实现将数据分成4个32位的值,并进行4个int的比较。如果当前的硬件支持128位SIMD,实现就会将两个Guid的数据加载为两个向量,并简单地进行一次比较。benchmark不测

private Guid _guid1 = Guid.Parse("0aa2511d-251a-4764-b374-4b5e259b6d9a");
private Guid _guid2 = Guid.Parse("0aa2511d-251a-4764-b374-4b5e259b6d9a");
[Benchmark]
public bool GuidEquals() => _guid1 == _guid2;

五:DateTime.Equals的优化
DateTime.Equals,DateTime是用一个单一的ulong _dateData字段实现的。其中大部分位存储了从1/1/0001 12:00am开始的ticks偏移量,每个tick是100纳秒,并且前两个位描述了DateTimeKind。因此,公共的Ticks属性返回_dateData的值,但前两位被屏蔽掉了,例如:_dateData & 0x3FFFFFFFFFFFFFFF。然后,平等运算符只是将一个DateTime的Ticks与其他DateTime的Ticks进行比较,这样我们就可以有效地得到(dt1._dateData & 0x3FFFFFFFFFFF)==(dt2._dateData & 0x3FFFFFFFFFFF)。然而,作为一个微观的优化,可以更有效地表达为((dt1._dateData ^ dt2._dateData) << 2) == 0。
这里其实是一个细微的优化,但是依然可见优化力度。

.Net6
; Program.DateTimeEquals()
       mov       rax,[rcx+8]
       mov       rdx,[rcx+10]
       mov       rcx,0FFFFFFFFFFFF
       and       rax,rcx
       and       rdx,rcx
       cmp       rax,rdx
       sete      al
       movzx     eax,al
       ret
; Total bytes of code 34
而在.NET 7上则产生。
; Program.DateTimeEquals()
       mov       rax,[rcx+8]
       mov       rdx,[rcx+10]
       xor       rax,rdx
       shl       rax,2
       sete      al
       movzx     eax,al
       ret
; Total bytes of code 22

所以我们得到的不是mov、and、and、cmp,而是xor和shl。

其它还有一些DateTime.Day、DateTime.DayOfYear、DateTime.DayOfYear改进性能。
六:数学API的优化
七:System.Formats.Tar压缩文件库的优化

2.循环克隆优化
循环克隆实际上是通过提前判断是否超出数组边界来进行的一个优化,如果没哟超过数组边界,则快速路就,超过了就慢速路径进行数组边界检查。

private int[] _values = Enumerable.Range(0, 1000).ToArray();
[Benchmark]
[Arguments(0, 0, 1000)]
public int LastIndexOf(int arg, int offset, int count)
{
    int[] values = _values;
    for (int i = offset + count - 1; i >= offset; i--)
        if (values[i] == arg)
            return i;
    return 0;
}

.Net7 ASM

; Program.LastIndexOf(Int32, Int32, Int32)
       sub       rsp,28
       mov       rax,[rcx+8]
       lea       ecx,[r8+r9+0FFFF]
       cmp       ecx,r8d
       jl        short M00_L02
       test      rax,rax
       je        short M00_L01
       test      ecx,ecx
       jl        short M00_L01
       test      r8d,r8d
       jl        short M00_L01
       cmp       [rax+8],ecx
       jle       short M00_L01
M00_L00:
       mov       r9d,ecx
       cmp       [rax+r9*4+10],edx
       je        short M00_L03
       dec       ecx
       cmp       ecx,r8d
       jge       short M00_L00
       jmp       short M00_L02
M00_L01:
       cmp       ecx,[rax+8]
       jae       short M00_L04
       mov       r9d,ecx
       cmp       [rax+r9*4+10],edx
       je        short M00_L03
       dec       ecx
       cmp       ecx,r8d
       jge       short M00_L01
M00_L02:
       xor       eax,eax
       add       rsp,28
       ret
M00_L03:
       mov       eax,ecx
       add       rsp,28
       ret
M00_L04:
       call      CORINFO_HELP_RNGCHKFAIL
       int       3
; Total bytes of code 98

M00_L00快速路径,M00_L01慢速路径,在M00_L00前面进行了一个判断,如果没有超出数组边界以及其它判断,那么就M00_L01不进行,否则M00_L02进行边界检查。
另外还有一个概念是循环提升,这个就另说了。


结尾

作者:江湖评谈
参照:[微软官方博客]
文章首发于公众号【江湖评谈】,欢迎大家关注。
image

标签:short,克隆,int,M00,Net7,优化,rax,ecx
From: https://www.cnblogs.com/tangyanzhi1111/p/17477250.html

相关文章

  • EasyCVR移动端火狐浏览器中云台显示问题的优化
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台能对前端接入设备进行统一集中管理,支持采用设备树对设备进行分组、分级管理,支持设备状态监测、云端运维等功能,实现对接入资源的集中控制与权限分配。有用户反馈,在移动端使用火狐浏览器,发现EasyCV......
  • Vue项目优化
    一、代码层面优化(1)v-if和v-show区分使用场景v-if和v-show的区别区别v-ifv-show手段动态的向DOM树内添加或者删除DOM元素通过设置DOM元素的display样式属性控制显隐编译过程有一个局部编译/卸载的过程是简单的基于css切换编译条件初始条件为假,则什么也不......
  • blender 绑骨rigify卡顿优化
    blender不是游戏引擎,没有设计性能分析工具,有的话也只能在专业的调试工具(如VisualCodeMSVC)里下载源码编译一遍才行。那么就从做对照试验开始吧卡顿因素:https://docs.blender.org/manual/en/2.79/render/blender_render/optimizations/performance.html而本次实验得出:删除......
  • 视频播放器的极致体验优化
    Photoby VladaKarpovich from Pexels视频体验由开始的视频清晰流畅,演变到现在的视频快速响应、即点即放、快速切换等等。基于这些优化林勇平将介绍播放器的一些技巧,使得视频体验在较少改动的情况下就能达到极致体验的效果。文/林勇平整理/LiveVideoStack直播回放https://w......
  • 图片优化之下一代图片格式WebP和AVIF
    本文最初由KaranjeetSingh在AdobeTechBlog上发表。已获作者授权翻译和发布。https://medium.com/adobetech/image-optimisation-with-next-gen-image-formats-webp-and-avif-248c75afacc4翻译:姜金元审校:LiveVideoStack特邀技术审校编辑:AlexWebP& AVIF 影音探索#002#  速......
  • 高性能视频推理引擎优化技术
    正文字数:9404 阅读时长:15分钟通过自身的实践经验,详细讲解了高性能视频推理引擎优化技术。文/ 鲍金龙整理/LiveVideoStack 大家晚上好,非常荣幸又有这个机会来LVS,与大家一起探讨一些问题。我第一次参加LVS应该是2017年,现在已经接近4年的时间了。今天的内容是推理引擎优化技术,......
  • 网络传输优化
    LiveVideoStackCon2022音视频技术大会北京站将于12月9日至10日在北京丽亭华苑酒店召开,本次大会将延续【音视频+无限可能】的主题,邀请业内众多企业及专家学者,将他们在过去一年乃至更长时间里对音视频在更多领域和场景下应用的探索、在实践中打磨优化技术的经验心得、对技术与商业......
  • 学术界AV1编码优化技术的进展
    #EditorialNote#学术界的一些优化工作实涵盖了编码过程的大部分模块。很明显的趋势就是许多深度学习的网络或者方法已经开始与编码的模块进行结合,并取得了很多不错的收益。本文将按照编码过程的大致顺序分享学术界AV1编码优化技术的进展。文 /朱辰整理/LiveVideoStack各位......
  • blender 面捕优化
    删除空顶点组importbpydefmake_group_list():obj=[]temp_list=[]group_list=[]so=bpy.context.selected_objectsforiinso:obj.append(i)foriinobj:#I'veused.extendhere(withsquarebrackets......
  • VM虚拟机模板,克隆或导入后网络不通问题解决办法
    出于工作需要可能需要对VM虚拟机制作模板,并导出为.vof文件,并根据vof模板文件导入为新的虚拟机,但是当导入后会发现网络不通,现将网络问题解决办法进行记录:本次实验OS为Centos7,网卡默认配置文件名为ifcfg-ens331.保留默认网卡网卡目录:/etc/sysconfig/network-scripts/保留默认......