C# 是否有接受Span的MemoryStream<;T>;或记忆<;T>;?
我从许多来源(memorymappedfile或FileStream)读取数据。一个问题是,每次读取字节、int或其他类型的调用都非常慢。因此,我想将一块数据读入一个数组,并将其交给一个轻量级内存流,然后读取其中的各个组件 问题是.NET的当前MemorySrream只允许构造函数中有一个数组,但我需要一个能够处理Span或Memor的流。在.NET源代码中有一个ReadOnlyMemoryStream作为一个内部类 有趣的是,ReadOnlyMemoryStream比MemoryStream慢,我本以为它不会有太大的区别C# 是否有接受Span的MemoryStream<;T>;或记忆<;T>;?,c#,.net,.net-core,C#,.net,.net Core,我从许多来源(memorymappedfile或FileStream)读取数据。一个问题是,每次读取字节、int或其他类型的调用都非常慢。因此,我想将一块数据读入一个数组,并将其交给一个轻量级内存流,然后读取其中的各个组件 问题是.NET的当前MemorySrream只允许构造函数中有一个数组,但我需要一个能够处理Span或Memor的流。在.NET源代码中有一个ReadOnlyMemoryStream作为一个内部类 有趣的是,ReadOnlyMemoryStream比MemoryStream慢
有更好的实现方法吗?如果您有一个
Span
,那么您已经尽可能快了,只需直接阅读它,而不是在它上面扑通一个流
Span
甚至可以让你在不复制(MemoryMarshal.Cast
)的情况下访问straightstruct
映射等非常漂亮的东西,Span增量(相当于流推进,是safe.Add
的一部分)、在实际需要时阻止复制(safe.Copy
)等。是的,有这样一种扩展方法,由Microsoft.Toolkit.HighPerformance
package提供
- 有关文档,请参见
- 有关代码,请访问
BinaryReader
,它的所有方法也是Marshal
和MemoryMarshal
的一部分,也可以在原始Span
上使用。Span
不能工作,因为这只是堆栈,不能是MemoryStream
之类的堆分配类的一部分。应该可以在内存中创建流,但我不知道有这样的实现。@KlausGütter:你当然是对的。似乎我需要将我自己的类一个作为ref结构,一个作为常规结构或类,以便使用Span或内存。我所知道的.NET核心源代码类中唯一可用但内部的类是ReadOnlyMemoryStream,它接受Memory.Thx作为信息。我知道这个工具箱,但我还没有看过扩展方法。不过,这是一个内部类。如果您使用的是NuGet软件包,那么您没有简单的方法来访问它。