【发布时间】:2021-06-25 06:40:48
【问题描述】:
我正在调查我们应用程序中的内存流量问题,发现大量浪费的内存是由 Stream API 造成的。
所以,你可能对这个方法很熟悉。
public abstract int Read(byte[] buffer, int offset, int count);
新接口支持 Span 作为第一个参数。 它看起来合乎逻辑,因为输出缓冲区应该是可变的。
当您尝试实现类似ReadOnlyStream 的smth 时会出现问题,它具有几乎相同的API。这里有一些我不明白的东西。
ReadOnlyStream的Read方法的实现
public override int Read(byte[] buffer, int offset, int count)
{
...//some checks
int chkOffset = (int)_Offset;
count = Math.Min(count, _Bytes.Length - chkOffset);
System.Buffer.BlockCopy(_Bytes, chkOffset, buffer, offset, count);
chkOffset += count;
_Offset = chkOffset;
return count;
}
因此,我们将缓冲区复制到初步分配的数组中。看起来这是保护流数据免于应对的唯一方法,但我们重载了 GC。
好的...我假设我们正在尝试适应 Stream 接口,但它看起来很奇怪,因为没有机会以某种适当的方式使其成为只读。
您是否有任何假设,为什么 .NET 的 Stream 接口中没有任何 ReadOnly 结构(例如 SpanReadOnly)?也许有一些我不熟悉的限制。
也许您对实现对 Stream 数据的免分配访问有一些建议。 (读取单个字节除外)
谢谢!
【问题讨论】:
标签: .net memory stream immutability