SocketAsyncEventArgs用于将缓冲区、偏移量和长度传递到Socket的ReceiveAsync和SendAsync方法中。
我做过测试,结果表明,
- 如果我不处理SocketAsyncEventArgs,会导致内存泄漏。
- 创建它、释放它并调用它的 SetBuffer 方法都会消耗大量的 CPU。
SocketAsyncEventArgs似乎是一个非常糟糕和错误的实现,它只是充当一个将缓冲区、其偏移量和长度传递给Socket的异步方法的包装器,会消耗大量 CPU。
有谁知道为什么?那么,如何将它与Socket的异步方法一起使用,而不会显着降低我的高吞吐量服务器的速度?
以下是测试代码。此测试方法被 1000 个线程调用。它被称为每秒 1000 次。但是如果我删除SocketAsyncEventArgs,它每秒被调用8000次。这似乎表明SocketAsyncEventArgs.SetBuffer消耗了大量的 CPU。
private static void Test(object obj)
{
TrueRandom random = new TrueRandom(500, 1300);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
while (true)
{
int iDesiredSize = random.GetRandomInteger() * 1000;
byte[] buffer = null;
try
{
buffer = ArrayPool<byte>.Shared.Rent(iDesiredSize);
args.SetBuffer(buffer, 0, buffer.Length);
ArrayPool<byte>.Shared.Return(buffer);
}
catch
{
}
Thread.Sleep(100);
}
}