【发布时间】:2020-05-17 17:57:02
【问题描述】:
据我所知,MemoryPool 和 ArrayPool 之间有什么区别,它们都做同样的事情(出租缓冲区以减少垃圾收集压力)。
在读取调用中是否应该首选使用NetworkStream 或WebSocket 的池?
【问题讨论】:
标签: c# .net .net-core memory-management
据我所知,MemoryPool 和 ArrayPool 之间有什么区别,它们都做同样的事情(出租缓冲区以减少垃圾收集压力)。
在读取调用中是否应该首选使用NetworkStream 或WebSocket 的池?
【问题讨论】:
标签: c# .net .net-core memory-management
ArrayPool<T> 类出租数组。换句话说,Rent 方法返回一个T[]。 Shared 属性返回ArrayPool<T>、TlsOverPerCoreLockedStacksArrayPool 的默认实现,它以ThreadStatic 存储桶数组和本地每个核心“堆栈”的组合缓存后备数组。它针对char 和byte 案例进行了优化。从Create 方法返回的ConfigurableArrayPool 将底层数组存储在Buckets 数组中(每个数组都有自己的数组)。此外,您可以编写自己的实现。
另一方面,MemoryPool<T> 更通用一点,因为它最终处理的是Memory<T> 对象。 Rent 方法分发 IMemoryOwner<T> 实现,它们负责拥有 Memory<T>。内存所有者可以得到各种来源的支持,数组就是其中之一。 MemoryPool<T>.Shared 单例实际上是一个 ArrayMemoryPool<T>,你猜对了,ArrayPool<T>.Shared 支持它。但是内存池可能由不同的来源支持,例如由SafeHandle 指向的非托管内存/内存。
使用哪一个真正取决于您的要求:
如果您使用的 API 需要 T[] 或者您只是想要一个无分配数组,那么您想要使用 ArrayPool<T>。
如果您正在使用Memory<T> 实例,那么您想使用MemoryPool<T>
如果您使用的 API 可以同时使用其中任何一个,那么使用一个池不一定比另一个池更有优势。 API 本身使用原始T[] 可能比使用Memory<T> 更好地工作(反之亦然),但API 应该只关心内存本身并且不知道它来自哪个池。
【讨论】: