您现在的位置是:网站首页> 编程资料编程资料
.net中的Span<T>类和Memory<T>类介绍_基础应用_
2023-05-24
254人已围观
简介 .net中的Span<T>类和Memory<T>类介绍_基础应用_
.net core 2.1的重头戏就是性能,其中最重要的两个类就是span和memory,本文这里简单的介绍一下这两个类的使用。
什么是 Span
Span
var arr = new byte[10]; Spanbytes = arr;
也可以取数组中的一部分:
var bytes = new Span(arr, 3, 5);
初一乍看,span
Spanbytes = stackalloc byte[2];
也可以引用指针数据,
Spanbytes; unsafe { bytes = new Span ((byte*)ptr, 1); }
另外,span还支持 reinterpret_cast 的理念,即可以将 Span
除了功能更加强大外,span在bcl库中也得到了更多的支持,大多数支持数组的函数现在基本上都能直接支持span了,如:
var inputSpan = input.AsSpan(); int first = int.Parse(inputSpan.Slice(3, 5));
这个函数中,int.Parse函数就能直接支持span,并且由于不产生子字符串,比使用substring的方法性能更高。
另外,系统也支持数组类型到span的隐式转换,同时提供了AsSpan的显示扩展方法,方便将数组类型转换为span。
除了功能强大外,span的性能也是非常高的,对span的操作基本上和访问数组一样高,无需通过计算来确定指针开头及其起始偏移,因为"引用"字段本身已对两者进行了封装。相比之下,ArraySegment
什么是 Memory
Span
- span包含"引用"字段(如数组的开头),这些引用被称为"内部指针"。对于 .NET 运行时的垃圾回收器,跟踪这些指针是一项成本相对高昂的操作。因此,运行时将这些引用约束为仅存在于堆栈上,因为它隐式规定了可以存在的内部指针数量下限。
- 对 Span 执行的读取和写入操作不是原子操作。如果多个线程同时对 Span 在堆上的字段执行读取和写入操作,存在"撕裂"风险。
这个限制决定了无法将 Span 装箱,进而无法将 Span
对于大部分同步处理功能,这个并没有太大的影响,但由于span
Memory和span的使用方法大同小异,
var arr = new byte[10]; var bytes = new Memory(arr, 3, 5);
不同之处在于 Memory
另外,也可以从Memory的Span属性创建指向该Memory的span,这样也可以使用span的强大的功能。
参考文章:
C# - Span 全面介绍:探索 .NET 新增的重要组成部分
到此这篇关于.net中Span
相关内容
- Rx.NET库中IDisposable对象的用法_实用技巧_
- .net中的DI框架AutoFac简单介绍_实用技巧_
- Asp.net core利用dynamic简化数据库访问_实用技巧_
- Asp.net core实现PushStream视频流推送_实用技巧_
- 在Asp.net core中实现websocket通信_实用技巧_
- 使用.NET Core创建exe应用程序_实用技巧_
- .Net弹性和瞬态故障处理库Polly实现执行策略_实用技巧_
- .Net弹性和瞬态故障处理库Polly实现弹性策略_实用技巧_
- .Net弹性和瞬态故障处理库Polly介绍_实用技巧_
- .NET6接入Skywalking链路追踪详细过程_实用技巧_
