免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

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

以上就是代碼的解析,相信很多人疑惑的地方就是Vector128.Max做了什么,我們可以構(gòu)造一個(gè)代碼,讓大家簡(jiǎn)單的看出來(lái)發(fā)生了什么 。代碼和運(yùn)行結(jié)果如下所示:
// 定義一個(gè)數(shù)組var array = new int[] { 4, 3, 2, 1, 1, 2, 3, 4 };// 拿到數(shù)組首地址指針ref int current = ref MemoryMarshal.GetReference(array.AsSpan());// 從首地址加載128位數(shù)據(jù),上面是int32// 所以x = 4, 3, 2, 1var x = Vector128.LoadUnsafe(ref current);// 偏移128位以后,繼續(xù)加載128位數(shù)據(jù)// 所以y = 1, 2, 3, 4var y = Vector128.LoadUnsafe(ref Unsafe.Add(ref current, Vector128<int>.Count));// 使用Vector128.Max進(jìn)行計(jì)算var result = Vector128.Max(x, y);// 打印輸出結(jié)果x.Dump();y.Dump();result.Dump();【是什么讓.NET7的Min和Max方法性能暴增了45倍?】

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

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

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

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

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀