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