C# 是否有接受Span的MemoryStream<;T>;或记忆<;T>;?

C# 是否有接受Span的MemoryStream<;T>;或记忆<;T>;?,c#,.net,.net-core,C#,.net,.net Core,我从许多来源(memorymappedfile或FileStream)读取数据。一个问题是,每次读取字节、int或其他类型的调用都非常慢。因此,我想将一块数据读入一个数组,并将其交给一个轻量级内存流,然后读取其中的各个组件 问题是.NET的当前MemorySrream只允许构造函数中有一个数组,但我需要一个能够处理Span或Memor的流。在.NET源代码中有一个ReadOnlyMemoryStream作为一个内部类 有趣的是,ReadOnlyMemoryStream比MemoryStream慢

我从许多来源(memorymappedfile或FileStream)读取数据。一个问题是,每次读取字节、int或其他类型的调用都非常慢。因此,我想将一块数据读入一个数组,并将其交给一个轻量级内存流,然后读取其中的各个组件

问题是.NET的当前MemorySrream只允许构造函数中有一个数组,但我需要一个能够处理Span或Memor的流。在.NET源代码中有一个ReadOnlyMemoryStream作为一个内部类

有趣的是,ReadOnlyMemoryStream比MemoryStream慢,我本以为它不会有太大的区别


有更好的实现方法吗?

如果您有一个
Span
,那么您已经尽可能快了,只需直接阅读它,而不是在它上面扑通一个流


Span
甚至可以让你在不复制(
MemoryMarshal.Cast
)的情况下访问straight
struct
映射等非常漂亮的东西,Span增量(相当于流推进,是
safe.Add
的一部分)、在实际需要时阻止复制(
safe.Copy
)等。

是的,有这样一种扩展方法,由
Microsoft.Toolkit.HighPerformance
package提供

  • 有关文档,请参见
  • 有关代码,请访问

当然,但是流提供了额外的方法(例如,使用binaryreader)。我编写了自己的扩展方法。你直接这么做当然是对的,但问题仍然是为什么MemoryStream比ReadOnlyMemoryStream(使用Span)快。如果这是个问题,那么你的文章标题就错了。至于
BinaryReader
,它的所有方法也是
Marshal
MemoryMarshal
的一部分,也可以在原始
Span
上使用。
Span
不能工作,因为这只是堆栈,不能是
MemoryStream
之类的堆分配类的一部分。应该可以在
内存中创建流,但我不知道有这样的实现。@KlausGütter:你当然是对的。似乎我需要将我自己的类一个作为ref结构,一个作为常规结构或类,以便使用Span或内存。我所知道的.NET核心源代码类中唯一可用但内部的类是ReadOnlyMemoryStream,它接受Memory.Thx作为信息。我知道这个工具箱,但我还没有看过扩展方法。不过,这是一个内部类。如果您使用的是NuGet软件包,那么您没有简单的方法来访问它。