C#Socketio Send vs BeginSend Performance

时间:2011-05-19 14:12:57

标签: c# performance sockets


所以我理解发送是同步的,而BeginSend是异步的。我听说套接字发送方法比数据传输更快,然后是BeginSend(注意:我不是在谈论CPU性能,而只是发送和接收数据包延迟)。任何人都能告诉我这是否属实?我指的是我在哪里听到同步数据传输的文章如下所示...... 如果是真的,有办法解决吗?或者这就是使用异步数据传输时的情况?

非常感谢你的帮助。

文章文字:

这两种通信形式都是传输数据的手段。不同之处在于数据传输的格式。 异步通信是最广泛用于PC通信的通信方法,通常用于电子邮件应用程序,Internet访问和异步PC到PC通信。通过异步通信,数据一次传输一个字节,每个字节包含一个起始位,八个数据位和一个停止位,因此总共产生十位。使用异步通信时,会产生大量开销,因为发送的每个字节都包含两个额外位(起始位和停止位),因此性能会大幅下降。

同步通信是更有效的通信方法。 CQ的连接解决方​​案通过同步通信方式进行通信。 通过同步通信,数据作为大数据块的帧而不是庞大的单个字节传输。同步的一个优点是在每个块的开始和结束处容易插入控制信息,以确保恒定的定时或同步。同步的另一个优点是它比异步更有效。例如,56 Kbps拨号同步线路可以承载每秒7000字节(56000/8),而56 Kbps拨号异步线路每秒只能承载5600字节(56000/10)。传输大量信息时,这可以显着提高速度和性能。

3 个答案:

答案 0 :(得分:4)

  

我听说套接字发送方法比数据传输更快,然后是BeginSend

不正确。

至于文章文本。你在谈论两件截然不同的事情。计算机程序中的异步网络连接和异步方法。

答案 1 :(得分:0)

肯定不是这样。本文讨论了网络连接类型背景下的同步和异步。但是,它与使用套接字发送数据的方式无关。在.Net,同步和异步中,简单地表示方法将如何阻止(同步)和非阻塞(异步),并且与数据传输速度无关。使用的任何同步和异步方法的延迟都是相同的。

答案 2 :(得分:0)

我要说的最重要的事情是同步套接字方法更容易编程,并且可以在单个包装函数中完成。 (我假设您将从Socket类继承并添加自定义错误处理,日志记录等以包裹发送和接收)

在Asynchronous的情况下,您将需要至少两个函数和另一个类或结构(StateObject)来跟踪您要传输的内容。

你当然可以使用匿名委托技术来掩盖回调方法的存在,但这并不会改变你的代码理解起来会更复杂的事实 (并保持)

我无法准确计算时间函数,但我已经看到,对于较小的字节大小(< 4K),同步似乎更快,对于更大的块(> 8K),异步似乎更好。也许,当你使用ASync接收更大的缓冲区时,Async func已经完成了,并且当你咀嚼先前收到的块时,你可以获得更多的字节。