perf: improved pool return method by using a hashset for searching if the returning item is already queued

This commit is contained in:
2025-10-10 14:21:54 +03:00
parent 651b0614c4
commit 28ca343b43

View File

@@ -10,22 +10,25 @@ public class Pool<T> : IPool<T>
private readonly Func<T> generator = null!; private readonly Func<T> generator = null!;
private readonly Queue<T> queue = new(); private readonly Queue<T> queue = new();
private readonly HashSet<T> queuedHashes = [];
public T Get() public T Get()
{ {
if (!queue.TryDequeue(out T? result)) if (!queue.TryDequeue(out T? result))
result = generator(); result = generator();
queuedHashes.Remove(result);
OnRemoved?.Invoke(this, result); OnRemoved?.Invoke(this, result);
return result; return result;
} }
public void Return(T item) public void Return(T item)
{ {
if (queue.Contains(item)) if (queuedHashes.Contains(item))
return; return;
queue.Enqueue(item); queue.Enqueue(item);
queuedHashes.Add(item);
OnReturned?.Invoke(this, item); OnReturned?.Invoke(this, item);
} }