如何在 C# 中实现可重用的对象池?

发布于 2024-11-07 02:20:48 字数 80 浏览 0 评论 0原文

我正在通过流套接字处理大量数据。数据被使用并留给 GC 进行清理。我想预先分配一个可重用池并重用它以防止大量GC。

谁能帮助我吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巾帼英雄 2024-11-14 02:20:48

恕我直言,这是一个有效的问题。特别是在使用经常分配缓冲区的套接字服务器时。它称为享元模式

但我不会轻易决定使用它。

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);
    }
}

用法:

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

var buffer= myPool.Dequeue();
// .. do something here ..
myPool.Enqueue(buffer);

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文