【问题标题】:Streams, ReadOnlyStreams and memory trafficStreams、ReadOnlyStreams 和内存流量
【发布时间】: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


    【解决方案1】:

    Streams 实现不能/不/不应该保证读取后保留一些内部缓冲区! SpanReadOnly 应该引用一些不可变的缓冲区以确保安全。因此,除了将读取的数据复制到新缓冲区之外别无选择。

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2011-12-30
      相关资源
      最近更新 更多