RecyclableMemoryStream:为 .NET 对象提供池化的库


如果你在.NET上,需要使用IO,请考虑使用RecyclableMemoryStream来减少分配。 尝试消除分配(new byte[]),对于大多数Web工作负载,您不需要Rust/C++。

MemoryStream以提高应用程序性能,特别是在垃圾收集领域。

Microsoft.IO.RecyclableMemoryStream是一种MemoryStream替代品,可为性能关键型系统提供卓越的行为。特别是它经过优化可以执行以下操作:

  • 使用池化缓冲区消除大对象堆分配
  • 发生的第 2 代 GC 次数要少得多,并且由于 GC 导致的暂停时间要少得多
  • 通过设置有界池大小来避免内存泄漏
  • 避免内存碎片
  • 允许多种方式读取和写入数据,以避免无关的分配
  • 提供出色的可调试性和日志记录
  • 提供绩效跟踪指标

特征

  • 语义接近原始System.IO.MemoryStream实现,并且旨在尽可能地作为直接替代。
  • 不是池化流本身,而是池化底层缓冲区。这允许您使用简单的Dispose模式将缓冲区释放回池,以及检测无效的使用模式(例如在处理流后重新使用流)。
  • RecyclableMemoryStreamManager是线程安全的(流本身本质上不是线程安全的)。
  • 实施IBufferWrite<byte>。
  • 通过抽象的缓冲区链接支持巨大的流。
  • 广泛支持较新的内存相关类型,例如、Span<byte>、和。ReadOnlySpan<byte>ReadOnlySequence<byte>Memory<byte>
  • 每个流都可以用在日志记录中使用的标识字符串进行标记 - 在查找与不正确的池使用相关的错误和内存泄漏时很有帮助。
  • 调试功能,例如记录流分配的调用堆栈以跟踪池泄漏
  • 在不使用太多内存的情况下处理使用高峰的最大可用池大小。
  • 池化算法的限制灵活且可调整。
  • 指标跟踪和事件,以便您可以看到对系统的影响。