gpt4 book ai didi

c# - ReceiveAsync 与 BeginReceive 的性能

转载 作者:可可西里 更新时间:2023-11-01 02:31:18 25 4
gpt4 key购买 nike

我目前正在编写一个客户端应用程序,我想知道我是否应该使用 Socket 类的 ReceiveAsync 或 BeginReceive 方法。到目前为止,我一直在使用后者,但是,我发现它似乎对 CPU 造成了很大的压力。这是我的接收循环的基本样子:

private void socket_ReceiveCallback(IAsyncResult result_)
{
// does nothing else at the moment
socket.EndReceive(result_);
byte[] buffer = (byte[])result_.AsyncState;

// receive new packet
byte[] newBuffer = new byte[1024];
socket.BeginReceive(newBuffer, 0, newBuffer.Length, SocketFlags.None,
socket_ReceiveFallback, newBuffer);
}

现在我一直在想我是否在这里做错了什么,因为其他通信的应用程序几乎不会给 CPU 带来压力。而且我想知道使用 SocketAsyncEventArgs 和 ReceiveAsync 是否会更好。

所以这是我的问题:

为什么我的循环对 CPU 的压力如此之大?我应该使用 SocketAsyncEventArgs 和 ReceiveAsync 而不是 BeginReceive 吗?

最佳答案

我一直在本地主机环回连接上对同步和异步套接字进行基准测试。我的结果是异步版本慢了大约 30%。考虑到异步 IO 现在风靡一时,这让我感到惊讶。我使用了多少线程并不重要。我可以使用 128 个线程,但同步 IO 仍然更快。

我认为这是因为异步 IO 需要更多分配和更多内核模式转换。

因此,如果您不希望有数百个同时连接,您可以切换到同步 IO。

关于c# - ReceiveAsync 与 BeginReceive 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com