1

SocketAsyncEventArgs用于将缓冲区、偏移量和长度传递到Socket的ReceiveAsyncSendAsync方法中。

我做过测试,结果表明,

  • 如果我不处理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);
        }
    }
4

0 回答 0