Windows:基于事件的重叠IO与IO完成端口,真实世界性能

时间:2017-06-20 23:26:38

标签: c++ windows winsock winsock2

所以我一直在研究重叠的IO插槽,用于我正在构建的服务器应用程序,我一直看到人们的评论说“从不使用hEvent"或者" IO完成端口将更快"等,但没有人说为什么不使用hEvent并且没有人在完成端口上提供任何真实数据或数字更快,或者多快多少hEvent WaitForMultipleObjects() hEvent更适合我的应用程序,所以如果速度差异很小,我倾向于使用它,但我不想在没有实际数据的情况下承诺告诉我,我在那里做了多大的牺牲。我用google搜索谷歌搜索谷歌并搜索任何基准或文章或者除了少数StackOverflow答案之外的任何比较两种策略的说法,并且不要使用这个和#34;没有理由。

有人可以在这里提供一些真实的信息或数字,说明使用ng build --base-href /dynamic-base-path/ 和完成端口之间的实际和现实世界的区别吗?

2 个答案:

答案 0 :(得分:3)

这个答案来自哈里约翰斯顿作为对这个问题的评论,经过一些搜索,我发现了一些让WaitForMultipleObjects成为可怕事情的细节。

您可以等待的最大对象数为64.仅此一项就使得WFMO方法的可扩展性几乎不存在。但是进一步观察,我找到了这个帖子:https://groups.google.com/forum/#!topic/comp.os.ms-windows.programmer.win32/okwnsYetF6g

  

在NT术语中,要进入等待,a   必须为每个对象分配等待块,并且每个等待块都是   排队等待您正在等待的对象,然后交叉链接到   线。当任何这些对象发出信号时,所有这些等待块   必须出列,取消链接,并取消分配回池。所有的   发生在DISPATCH_LEVEL和除池分配之外的所有内容并且是免费的   调度员螺旋锁持有发生。

     

(带有fAll == TRUE的WFMO甚至更贵。每次都是   对象发出信号,所有其他对象都必须进行检查。这一切   发生了,你猜对了,在调度员自旋锁的DISPATCH_LEVEL   保持。)

调度程序级别的自旋锁防止整个系统中线程的抢占和时间限制,即使有多个核心也是如此。如果您等待3个以上的对象,那么这是可怕的,并且永远不会使用WFMO的一个很好的理由(该线程预先分配了3个等待块,可以避免很多如果你等待3个或更少)。

答案 1 :(得分:2)

为获得最佳性能,您应该使用IO完成端口。插座数量没有限制。所有其他类似select的api只能为1024个套接字提供服务,性能将迅速下降,同时还需要高于所需的CPU使用率。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx

您还可以查看关于asynchrounous i / o的精彩演示文稿,我认为这是任何考虑编写中型到大型客户端服务器应用程序的人必须关注的。

时间的历史:异步C ++ - Steven Simpson [ACCU 2017] https://www.youtube.com/watch?v=Z8tbjyZFAVQ

在本演示文稿中,您将找到可用技术的完整描述和比较,以及基准测试结果。值得花时间。

WaitForMultipleObjects()限制为64个句柄使得处理涉及多个i / o流的任何内容变得不实用。