以上就是代码的解析,相信很多人疑惑的地方就是Vector128.Max做了什么,我们可以构造一个代码,让大家简单的看出来发生了什么 。代码和运行结果如下所示:
// 定义一个数组var array = new int[] { 4, 3, 2, 1, 1, 2, 3, 4 };// 拿到数组首地址指针ref int current = ref MemoryMarshal.GetReference(array.AsSpan());// 从首地址加载128位数据,上面是int32// 所以x = 4, 3, 2, 1var x = Vector128.LoadUnsafe(ref current);// 偏移128位以后,继续加载128位数据// 所以y = 1, 2, 3, 4var y = Vector128.LoadUnsafe(ref Unsafe.Add(ref current, Vector128<int>.Count));// 使用Vector128.Max进行计算var result = Vector128.Max(x, y);// 打印输出结果x.Dump();y.Dump();result.Dump();
文章插图
从运行的结果可以看到,result中保存的是x和y对应位置的最大值,这样是不是就觉得清晰明了,Stephe大佬上文的代码就是做了这样一个操作 。
同样,如果我们把int32换成int64,也就是long类型,由于一个元素占用64位 , 所以一次只能加载2个int64元素比较最大值,得出对应位置的最大值:
文章插图
最后使用下面的for循环代码,从result中找到最大的那个int32元素,从我们上文的案例中就是4,结果和代码如下所示:
var value = result[0];for (int i = 1; i < Vector128<int>.Count; i++){ if (value < result[i]) {value = result[i]; }}
文章插图
要注意的是,为了演示方便我这里数组bit长度刚好是128倍数,实际情况中需要考虑不是128倍数的场景 。
总结答案显而易见,试.NET7中Min()和Max()方法性能暴增45倍的原因就是Stephe大佬对基本几个连续的值类型比较做了SIMD优化 , 而这样的优化在本次的.NET7版本中有非常多,后面有时间带大家一起看看SIMD又是如何提升其它方面的性能的 。
【是什么让.NET7的Min和Max方法性能暴增了45倍?】
推荐阅读
- React动画实现方案之 Framer Motion,让你的页面“自己”动起来
- 暗黑破坏神:不朽遗志获取方法是什么
- 原神破绽的捕捉方法是什么
- 迷你世界9月14日礼包兑换方式是什么
- 白苹果是什么意思,白苹果怎么修复(白苹果会自己恢复吗)
- 原神元能构装体掉落奖励是什么
- 羊了个羊小游戏爆火攻略是什么
- 原神圣显之钥技能是什么
- 原神3.1版本前瞻兑换码是什么
- 卷帙浩繁读音是什么 卷帙浩繁的读音