是什么讓.NET7的Min和Max方法性能暴增了45倍?( 二 )

以上就是代碼的解析,相信很多人疑惑的地方就是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();

是什么讓.NET7的Min和Max方法性能暴增了45倍?

文章插圖
從運行的結果可以看到,result中保存的是x和y對應位置的最大值,這樣是不是就覺得清晰明了,Stephe大佬上文的代碼就是做了這樣一個操作 。
同樣,如果我們把int32換成int64,也就是long類型,由于一個元素占用64位 , 所以一次只能加載2個int64元素比較最大值,得出對應位置的最大值:
是什么讓.NET7的Min和Max方法性能暴增了45倍?

文章插圖
最后使用下面的for循環代碼,從result中找到最大的那個int32元素,從我們上文的案例中就是4,結果和代碼如下所示:
var value = result[0];for (int i = 1; i < Vector128<int>.Count; i++){ if (value < result[i]) {value = result[i]; }}
是什么讓.NET7的Min和Max方法性能暴增了45倍?

文章插圖
要注意的是,為了演示方便我這里數組bit長度剛好是128倍數,實際情況中需要考慮不是128倍數的場景 。
總結答案顯而易見,試.NET7中Min()和Max()方法性能暴增45倍的原因就是Stephe大佬對基本幾個連續的值類型比較做了SIMD優化 , 而這樣的優化在本次的.NET7版本中有非常多,后面有時間帶大家一起看看SIMD又是如何提升其它方面的性能的 。
【是什么讓.NET7的Min和Max方法性能暴增了45倍?】

推薦閱讀