ストリーミングソケットから大量のデータを処理しています。データは使用され、GCがクリーンアップするために残されます。再利用可能なプールを事前に割り当てて再利用し、GCが大量に発生しないようにします。
誰か助けてもらえますか?
ストリーミングソケットから大量のデータを処理しています。データは使用され、GCがクリーンアップするために残されます。再利用可能なプールを事前に割り当てて再利用し、GCが大量に発生しないようにします。
誰か助けてもらえますか?
私見それは有効な質問です。特に、バッファの割り当てが頻繁に行われるソケットサーバーで作業する場合。これはフライウェイトパターンと呼ばれます。
しかし、私はそれを軽く使うという決断をしません。
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);