.NET7比.NET6有高达45倍的性能提升,当时Benchmark代码和结果如下所示:
[Params(1000)]
public int Length { get; set; }
private int[] arr;
[GlobalSetup]
public void GlobalSetup() => arr = Enumerable.Range(0, Length).ToArray();
[Benchmark]
public int Min() => arr.Min();
[Benchmark]
public int Max() => arr.Max();
方法 | 运行时 | 数组长度 | 平均值 | 比率 | 分配 |
---|---|---|---|---|---|
Min | 1000 | 3,494.08 ns | 53.24 | 32 B | |
Min | 1000 | 65.64 ns | 1.00 | - | |
Max | 1000 | 3,025.41 ns | 45.92 | 32 B | |
Max | 1000 | 65.93 ns | 1.00 | - |
可以看到有高达45倍的性能提升,那就有小伙伴比较疑惑,在.NET7中到底是做了什么让它有如此大的性能提升?
所以本文就通过.NET7中的一些pr带大家一起探索下.NET7的Min()
和Max()
方法是如何变快的。
首先我们打开.NET Runtime的仓库,应该没有人不会知道仓库的地址吧?里面包含了.NET运行时所有的代码,包括CLR和BCL库。地址如下所示:
https://github.com/dotnet/runtime
然后我们熟练的根据命名空间System.Linq
找到Linq
所在的文件夹位置,如下所示:
可以看到很多Linq
相关的方法都在这个文件夹内,让我们先来找一找Max()
方法所对应的类。就是下方所示,我们可以看到刚好异步小王子Stephen Toub大佬提交了一个优化代码。
然后我们点击History
查看这个类的提交历史,我们发现Stephen大佬在今年多次提交代码,都是优化其性能。
找到Stephen大佬的第一个提交,我们发现在Max
的代码中,多了一个特殊的路径,如果数据类型为int[]
,那么就走单独的一个方法重载,并在这个重载中启用了SIMD
向量化,代码如下所示:
SIMD向量化在我之前的多篇文章中都有提到(如:.NET如何快速比较两个byte数组是否相等),它是CPU的特殊指令,使用它可以大幅度的增强运算性能,我猜这就是性能提升的原因。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!