.NET點滴:Span<T>
阿新 • • 發佈:2022-12-04
把一個數組的全部元素加1,有什麼好辦法,於是有了下面的分析:
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//方法一
foreach (var i in arr)
{
i++;
}
//方法二
for (var i = 0; i < arr.Length; i++)
{
arr[i] += 1;
}
//方法三
foreach (ref var i in arr.AsSpan())
{
i++;
}
方法一在編譯時會報錯的,提示如下:無法為"i"賦值,因為它是"foreach"迭代變數,foreach迴圈時,是通過yield return返回的只讀資料,所以不能給它賦值。
方法二沒有問題,遍歷元素,輪詢加1。
方法三比較有意思了,是通過Span<T>來用ref(可以理解成指標,或引用)的方式來,來指向陣列的元素,實現加1。
關於Span<T>,借用官方的一句話:“由於 Span<T> 是任意記憶體塊(可以是託管記憶體,本機記憶體,堆疊記憶體)的抽象,因此 Span<T> 具有引數的型別和方法的方法將 Span<T> 在任何物件上操作, Span<T> 而不考慮它所封裝的記憶體型別。”,可以清楚的理解Span<T>的專門作用。
關於方法二和方法三的效能怎麼樣,下來是測試程式碼和結果,供大家參考:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
BenchmarkRunner.Run<TestSpan>();
public class TestSpan
{
[Benchmark]
public void Demo1()
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (ref var i in arr.AsSpan())
{
i ++;
}
}
[Benchmark]
public void Demo2()
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (var i = 0; i < arr.Length; i++)
{
arr[i] += 1;
}
}
}
結果:
想要更快更方便的瞭解相關知識,可以關注微信公眾號