.NET点滴:SpanT
生活随笔
收集整理的這篇文章主要介紹了
.NET点滴:SpanT
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
昨天小桂問了一個問題,把一個數組的全部元素加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;}} }結果:
總結
以上是生活随笔為你收集整理的.NET点滴:SpanT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor University (1
- 下一篇: C# StreamReader类和Str