【问题标题】:Difference between MemoryPool<T> and ArrayPool<T>MemoryPool<T> 和 ArrayPool<T> 之间的区别
【发布时间】:2020-05-17 17:57:02
【问题描述】:

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

在读取调用中是否应该首选使用NetworkStreamWebSocket 的池?

【问题讨论】:

    标签: c# .net .net-core memory-management


    【解决方案1】:

    ArrayPool&lt;T&gt; 类出租数组。换句话说,Rent 方法返回一个T[]Shared 属性返回ArrayPool&lt;T&gt;TlsOverPerCoreLockedStacksArrayPool 的默认实现,它以ThreadStatic 存储桶数组和本地每个核心“堆栈”的组合缓存后备数组。它针对charbyte 案例进行了优化。从Create 方法返回的ConfigurableArrayPool 将底层数组存储在Buckets 数组中(每个数组都有自己的数组)。此外,您可以编写自己的实现。

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

    使用哪一个真正取决于您的要求:

    • 如果您使用的 API 需要 T[] 或者您只是想要一个无分配数组,那么您想要使用 ArrayPool&lt;T&gt;

    • 如果您正在使用Memory&lt;T&gt; 实例,那么您想使用MemoryPool&lt;T&gt;

    如果您使用的 API 可以同时使用其中任何一个,那么使用一个池不一定比另一个池更有优势。 API 本身使用原始T[] 可能比使用Memory&lt;T&gt; 更好地工作(反之亦然),但API 应该只关心内存本身并且不知道它来自哪个池。

    【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2021-04-09
    • 2016-01-19
    相关资源
    最近更新 更多