Winapi 每个TCP套接字多个挂起读取或多个挂起写入的性能优势?

Winapi 每个TCP套接字多个挂起读取或多个挂起写入的性能优势?,winapi,networking,asynchronous,iocp,Winapi,Networking,Asynchronous,Iocp,IOCP对许多连接都很好,但我想知道的是,允许每个TCP套接字有多个挂起的接收或多个挂起的写入是否有显著的好处,或者如果我只允许每个套接字有一个挂起的接收和一个挂起的发送,我是否真的会失去性能(这确实简化了事情,因为我不必处理无序的完成通知) 我的一般用例是2个工作线程为IOCP端口提供服务,处理多个连接(多于2个但少于10个),其中传输的数据有两种形式:一种是频繁的非常小的消息(如果可能的话,我会手动组合这些消息,但通常需要经常发送,以使每次发送的数据仍然非常小),另一个是传输大文件。对于少于

IOCP对许多连接都很好,但我想知道的是,允许每个TCP套接字有多个挂起的接收或多个挂起的写入是否有显著的好处,或者如果我只允许每个套接字有一个挂起的接收和一个挂起的发送,我是否真的会失去性能(这确实简化了事情,因为我不必处理无序的完成通知)


我的一般用例是2个工作线程为IOCP端口提供服务,处理多个连接(多于2个但少于10个),其中传输的数据有两种形式:一种是频繁的非常小的消息(如果可能的话,我会手动组合这些消息,但通常需要经常发送,以使每次发送的数据仍然非常小),另一个是传输大文件。

对于少于10个连接和TCP,即使在高速率下,您也可能感觉不到任何差异。只需增加缓冲区大小,您就可以看到更好的性能


如果您的应用程序突发且处理成本高昂,排队I/O会有所帮助。基本上,排队I/O可以让您提前执行成本高昂的工作,这样当突发发生时,您就可以在I/O上使用一点CPU,在处理上使用尽可能多的CPU。

对于少于10个连接和TCP,您可能不会感觉到任何差异即使是在高速率下,只要增加缓冲区大小,您就可以看到更好的性能


如果您的应用程序突发且处理成本高昂,排队I/O会有所帮助。基本上,排队I/O可以让您提前执行成本高昂的工作,这样当突发发生时,您就可以在I/O上使用一点CPU,在处理上使用尽可能多的CPU。

除非您计划关闭t网络堆栈的recv缓冲在这种情况下是必不可少的。请记住,如果您决定发出多个挂起的recv,那么您必须做一些工作,以确保您以正确的顺序处理它们。而recv将按照发出顺序从IOCP中完成。线程调度问题可能意味着它们是进程由不同的I/O线程以不同的顺序执行,除非您积极工作以确保情况并非如此,请参阅以获取详细信息


多个挂起的发送更有助于充分利用TCP连接的可用TCP窗口(并以可能的最大速率发送)但是,只有当您有大量数据要发送时,只有当您希望尽可能高效地发送数据时,并且只有当您注意确保没有太多挂起的写入时,才能发送数据。有关如果您不积极管理挂起的写入数目的话可能遇到的问题的详细信息,请参阅。

多个挂起的RECV往往用途有限除非您计划关闭网络堆栈的recv缓冲,在这种情况下,它们是必不可少的。请记住,如果您确实决定发出多个挂起的recv,那么您必须做一些工作,以确保您以正确的顺序处理它们。而recv将按照发出线程调度问题的顺序从IOCP完成这可能意味着它们由不同的I/O线程以不同的顺序进行处理,除非您积极努力确保情况并非如此,有关详细信息,请参阅


多个挂起的发送更有助于充分利用TCP连接的可用TCP窗口(并以可能的最大速率发送)但是,只有当您有大量数据要发送时,只有当您希望尽可能高效地发送数据时,并且只有当您注意确保没有太多挂起的写入时,才可以发送数据。有关如果您不主动管理挂起的写入数目的话可能遇到的问题的详细信息,请参阅。

延迟最重要的流式传输是什么tant因素(比如控制信号或其他近实时信息)?我认为这会很有用,因为我想在不等待前一次发送完成的情况下启动下一次发送。是的,这将是一个有用的场景。我认为它总是有用的;)如果稍微复杂一点……那么延迟是最重要因素(比如控制信号或其他近实时信息)的流式传输呢?我认为这会很有用,因为我想在不等待前一次发送完成的情况下启动下一次发送。是的,这将是一个有用的场景。我觉得它总是有用的;)如果稍微复杂一点。。。