MemoryPool<T> 和 ArrayPool<T> 的区别

g18*_*18c 7 .net c# memory-management .net-core

据我所知,MemoryPoolArrayPool之间有什么区别,它们都做同样的事情(出租缓冲区以减少垃圾收集压力)。

是否有一个池应该在读取调用中首选使用NetworkStreamWebSocket

pin*_*x33 10

ArrayPool<T>班出租阵列。换句话说,该Rent方法返回一个T[]. 该Shared属性返回 an 的默认实现ArrayPool<T>TlsOverPerCoreLockedStacksArrayPoolThreadStatic以存储桶数组和本地每核“堆栈”的组合缓存后备数组。它针对charbyte情况进行了优化。在ConfigurableArrayPool从返回的Create方法存储的基本阵列中的阵列Buckets(每个具有它自己的数组的数组)。此外,您可以编写自己的实现。

另一方面,MemoryPool<T>它更通用,因为它最终处理Memory<T>对象。该Rent方法分发IMemoryOwner<T>实现,这些实现负责拥有一个Memory<T>. 内存所有者可以得到各种来源的支持,数组就是其中之一。该MemoryPool<T>.Shared单实际上是一个ArrayMemoryPool<T>这是由你猜对了支持,ArrayPool<T>.Shared。但是内存池可能由不同的来源支持,例如由 a 指向的非托管内存/内存SafeHandle

使用哪一个实际上取决于您的要求:

  • 如果您使用的 API 需要一个T[]或您只是想要一个无分配数组,那么ArrayPool<T>这就是您想要使用的。

  • 如果您正在使用Memory<T>实例,那么您想使用MemoryPool<T>

如果您使用的 API 可以采用任何一种,那么使用一个池不一定比另一个更好。API 本身可能T[]比原始数据更好地工作Memory<T>(反之亦然),但 API 应该只关心内存本身并且不知道它来自的池。

  • 相关:https://endjin.com/blog/2020/09/arraypool-vs-memorypool-minimizing-allocations-ais-dotnet (5认同)