1. 程式人生 > 其它 >.NET點滴:Span<T>

.NET點滴:Span<T>

  把一個數組的全部元素加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; } } }

結果:

  想要更快更方便的瞭解相關知識,可以關注微信公眾號