4

I'm processing a lot of data off a streaming socket. The data is used and left for the GC to clean up. I want to allocate a reuseable pool upfront and reuse it to prevent lots of GCs.

Can anyone help me?

R. Martinho Fernandes
  • 228,013
  • 71
  • 433
  • 510
arkina
  • 991
  • 2
  • 11
  • 17
  • There's a more-recently-updated version of this question: https://stackoverflow.com/questions/2510975/c-sharp-object-pooling-pattern-implementation – dbruning Jun 03 '21 at 22:37

1 Answers1

6

imho it's a valid question. Especially when working with socket servers where allocating buffers is done frequently. It's called flyweight pattern.

But I wouldn't take the decision to use it lightly.

class BufferPool<T>
{
    private readonly Func<T> _factoryMethod;
    private ConcurrentQueue<T> _queue = new ConcurrentQueue<T>();

    public BufferPool(Func<T> factoryMethod)
    {
        _factoryMethod = factoryMethod;
    }

    public void Allocate(int count)
    {
        for (int i = 0; i < count; i++)
            _queue.Enqueue(_factoryMethod());
    }

    public T Dequeue()
    {
        T buffer;
        return !_queue.TryDequeue(out buffer) ? _factoryMethod() : buffer;
    }

    public void Enqueue(T buffer)
    {
        _queue.Enqueue(buffer);
    }
}

Usage:

var myPool = new BufferPool<byte[]>(() => new byte[65535]);
myPool.Allocate(1000);

var buffer= myPool.Dequeue();
// .. do something here ..
myPool.Enqueue(buffer);
jgauffin
  • 99,844
  • 45
  • 235
  • 372