首页 > 解决方案 > C#中的ArrayPool创建方法

问题描述

我在 C# 中与 ArrayPool 一起使用。我想创建自己的池,最大数组数量为 5,最大数组大小为 1050000。我使用了这个 ArrayPool.Create() 方法。我无法理解一件事-我试图在下面的代码段中从池中租用 10 次,尽管我将最大数组指定为 5,但为什么它没有显示任何错误。另外,我将最大长度指定为 1050000。那么我如何才能租用 4200000 数组而不会出现任何错误?

        byte[] buffer;
        ArrayPool<byte> pool = ArrayPool<byte>.Create(1050000, 5);

        for (int i = 0; i < 10; i++)
        {
            buffer = pool.Rent(4200000);
        }

标签: c#buffercompiler-optimization

解决方案


传递给的选项ArrayPool.Create并不意味着您不能接收大于这些限制的数组。相反,它们用于控制ConfigurableArrayPool. 第二个参数是存储桶中的最大槽数,第一个参数是任何数组的最大大小。该值由一个内部常数限制,该常数1,048,576已经小于您的1,050,000.

当您Rent从阵列池中时,算法将尝试在其中一个存储桶/插槽中定位阵列。这些存储桶(及其内部插槽)的数量受到您传入的值的限制。如果池没有请求的最小大小的数组,要么因为所有插槽都在使用中,要么因为请求的大小更大超过最大值,它将改为分配一个新的(不合并它)并返回它。

简而言之,当您请求一个大于您传递给该Create方法的(上限)大小的数组时,您将产生分配并接收一个不参与池的数组。使用此数组调用Return不会将其放回池中;相反,它将被“丢弃”

但请记住,这些规则仅适用于内置数组池。您(或其他人)可以编写一个限制返回数组大小甚至抛出的实现——尽管我认为这些可能不被认为是表现良好的(至少在没有支持文档的情况下)。

根据您的评论更新:

虽然 true 没有直接对应于桶数的参数,但有间接对应的参数。桶的数量是使用您传入的最大数组大小来计算的。最大桶是根据 2 的幂和其他一些逻辑来确定的。


推荐阅读