Span 提供任意記憶體的連續區域的類型安全和記憶體安全表示形式。它是在堆棧而不是托管堆上分配的ref結構,是對任意記憶體塊的抽象 。 1.關於Span 在NET Core 2.1中首次引入 提供對任意記憶體上的連續區域的讀寫視圖 利用索引/迭代來修改範圍內的記憶體 幾乎無開銷 2.和記憶體的關係 Span 表 ...
Span 提供任意記憶體的連續區域的類型安全和記憶體安全表示形式。它是在堆棧而不是托管堆上分配的ref結構,是對任意記憶體塊的抽象 。
1.關於Span
-
在NET Core 2.1中首次引入
-
提供對任意記憶體上的連續區域的讀寫視圖
- 利用索引/迭代來修改範圍內的記憶體
- 幾乎無開銷
2.和記憶體的關係
Span 表示任意記憶體的連續區域。 Span<T>實例通常用於保存數組的元素或數組的一部分。 但是,與數組不同, Span<T>實例可以指向堆棧上托管的記憶體、本機記憶體或托管的記憶體。
3.性能測試
Span通常用來處理數組,所以本次測試的場景是數組的切分:從一個數組的中間元素開始,獲取並返回四分之一個元素。
3.1 數組初始化
這裡我們準備一個數組分三種不同長度進行初始化,有利於覆蓋到更多的測試情況。
3.2 測試採用三種方式,用BenchmarkDotNet比較一下:
第一種(常規):
第二種(複製):
第三種(Span切片):
性能測試結果如下,可以看到Span的速度是很快的,且不占記憶體。
4. 切片
Span<T>.Slice()方法就是對記憶體進行切片,第三種方法區別於前兩種,本質上不創建和銷毀對象,可以認為是做到了記憶體0分配
5. ReadOnlySpan
ReadOnlySpan是Span的只讀表示形式,通常用在string的切片(因為string的不可變性)
6. Span<T>局限性
-
Span是僅限存活在堆棧上的值類型
-
Span不能是非堆棧類型的欄位
-
Span不能被裝箱
-
Span不能是非同步方法的參數或局部變數
-
Span不能被lambda表達式捕獲