Span 提供任意內(nèi)存的連續(xù)區(qū)域的類型安全和內(nèi)存安全表示形式。它是在堆棧而不是托管堆上分配的ref結(jié)構(gòu),是對任意內(nèi)存塊的抽象?。
1.關(guān)于Span
-
在NET Core 2.1中首次引入
-
提供對任意內(nèi)存上的連續(xù)區(qū)域的讀寫視圖
- 利用索引/迭代來修改范圍內(nèi)的內(nèi)存
- 幾乎無開銷
2.和內(nèi)存的關(guān)系
? Span 表示任意內(nèi)存的連續(xù)區(qū)域。?Span<T>實例通常用于保存數(shù)組的元素或數(shù)組的一部分。 但是,與數(shù)組不同, Span<T>實例可以指向堆棧上托管的內(nèi)存、本機(jī)內(nèi)存或托管的內(nèi)存。
3.性能測試
Span通常用來處理數(shù)組,所以本次測試的場景是數(shù)組的切分:從一個數(shù)組的中間元素開始,獲取并返回四分之一個元素。
3.1?數(shù)組初始化
這里我們準(zhǔn)備一個數(shù)組分三種不同長度進(jìn)行初始化,有利于覆蓋到更多的測試情況。
?
3.2 測試采用三種方式,用BenchmarkDotNet比較一下:
第一種(常規(guī)):
? 第二種(復(fù)制):
? 第三種(Span切片):
? 性能測試結(jié)果如下,可以看到Span的速度是很快的,且不占內(nèi)存。
?
?4. 切片
Span<T>.Slice()方法就是對內(nèi)存進(jìn)行切片,第三種方法區(qū)別于前兩種,本質(zhì)上不創(chuàng)建和銷毀對象,可以認(rèn)為是做到了內(nèi)存0分配
5. ReadOnlySpan
ReadOnlySpan是Span的只讀表示形式,通常用在string的切片(因為string的不可變性)
?
?6. Span<T>局限性
-
Span是僅限存活在堆棧上的值類型
-
Span不能是非堆棧類型的字段
-
Span不能被裝箱
-
Span不能是異步方法的參數(shù)或局部變量文章來源:http://www.zghlxwxcb.cn/news/detail-745941.html
-
Span不能被lambda表達(dá)式捕獲文章來源地址http://www.zghlxwxcb.cn/news/detail-745941.html
到了這里,關(guān)于編寫高性能C#代碼 —— Span<T>的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!