Предлагаю прочитать статью от некого Евгения про осторожное использование ArrayPool в многопоточной среде. Автор рассказал о том, как пул устроен и какие есть способы работать с ним для разных сценариев. Бенчмарки, схемы и разбор диагностик прилагаются.
Вот какие выводы были сделаны:
- Пулинг объектов (в том числе массивов) помогает снизить аллокации и нагрузку на GC.
- Неудачная или неподходящая для конкретного профиля нагрузки реализация пула может испортить производительность.
- Для небольших массивов, нужных на короткое время, предпочтительно использовать масштабирующийся ArrayPool<T>.Shared.
- Для больших массивов желательно использовать пул, созданный через ArrayPool<T>.Create как более вместительный и не разделённый по потокам.