Какие параметры используются в ArrayPool в C# и как они влияют на его работу?

  • 28 августа 2023 г. 9:36
Ответы на вопрос 2
Параметры `maxArrayLength` и `maxArraysPerBucket` влияют на работу пула массивов следующим образом:

1. `maxArrayLength`: Максимальная длина массива, которая может быть хранена в пуле. Если массив превышает эту длину, то он не будет помещен в пул и будет создан новый массив.
2. `maxArraysPerBucket`: Максимальное количество массивов, которые могут быть хранены в каждом "контейнере" в пуле. Контейнеры группируют массивы одинаковой длины и используются для более эффективного доступа к массивам. Если количество массивов в контейнере достигает этого значения, то новый массив создается вне пула.

Используя приведенный вами код:

```csharp
ArrayPool<int> pool = ArrayPool<int>.Create(1,1);
var a1=pool.Rent(5000000);
pool.Rent(5000000);
pool.Rent(5000000);
pool.Rent(5000000);
pool.Rent(5000000);
```

Вы задали значения `maxArrayLength = 1` и `maxArraysPerBucket = 1`, что означает, что пул будет иметь максимальный размер 1 элемент и в каждом контейнере может быть только 1 массив. Тем не менее, при вызове `pool.Rent(5000000)` пул массивов будет создан, так как этот массив превышает максимальную длину, заданную в `maxArrayLength`. Пул массивов не вызывает исключение при превышении максимальной длины, а просто создает новый массив вне пула.

Что касается `pool.Return()`, этот метод возвращает массив в пул, чтобы его можно было использовать повторно. Вы не обязаны очищать или обнулять массив перед использованием метода `pool.Return()`. Когда вы вызываете `pool.Return()`, пул массивов принимает этот массив обратно и может позже предоставить его другому коду, который вызывает метод `pool.Rent()`. Внутри пула массивов могут быть выполнены определенные операции для подготовки массива к повторному использованию.
Создание массива с помощью оператора "Create" резервирует память, но не ограничивает его длину. То есть, память выделяется при вызове "Create", а затем может быть дополнительно выделена при вызове "Rent", если размер массива превышен. Если "Rent" запрашивает меньшее количество элементов, чем было выделено при вызове "Create", то дополнительная память не выделяется. Аналогично работает метод "List capacity".
Похожие вопросы