.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;
}
}
}
结果:
想要更快更方便的了解相关知识,可以关注微信公众号

分类:
.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下