我創建了一個簡單的緩衝區管理器類,用於異步套接字。這將防止內存碎片並提高性能。任何關於進一步改進或其他方法的建議?對線程安全無阻塞緩衝區管理器的建議
public class BufferManager
{
private int[] free;
private byte[] buffer;
private readonly int blocksize;
public BufferManager(int count, int blocksize)
{
buffer = new byte[count * blocksize];
free = new int[count];
this.blocksize = blocksize;
for (int i = 0; i < count; i++)
free[i] = 1;
}
public void SetBuffer(SocketAsyncEventArgs args)
{
for (int i = 0; i < free.Length; i++)
{
if (1 == Interlocked.CompareExchange(ref free[i], 0, 1))
{
args.SetBuffer(buffer, i * blocksize, blocksize);
return;
}
}
args.SetBuffer(new byte[blocksize], 0, blocksize);
}
public void FreeBuffer(SocketAsyncEventArgs args)
{
int offset = args.Offset;
byte[] buff = args.Buffer;
args.SetBuffer(null, 0, 0);
if (buffer == buff)
free[offset/blocksize] = 1;
}
}
偉大的建議!首先,我決定使用一個larg緩衝區來防止內存碎片。但是,當所有字節將被同時分配時,可能無關緊要。 – remdao
由於只有80K或以上的分配才從沒有壓縮的大對象堆獲取,所以碎片只會成爲大於80K左右的緩衝區的問題。任何少數東西都來自GC在收集之後會緊湊的正常堆,從而消除任何碎片。 – AnthonyWJones
我意識到,將緩衝區管理器實現爲一個字節數組堆棧可能會更好。因爲如果它不需要跟蹤偏移量,那麼沒有理由產生循環。推送和彈出字節數組對象會更快。 – remdao