http://210.51.37.76/compare.jpg
以上连接是6种不同模型有各种压力测试下的性能的总结,WSAAsyncSelect模型的测试结果是属于中下的,以这性能,这种模型是不适合于比较大量的连接的,但事实上真是这样吗?让我们比较下WSAAsyncSelect,WSAEventSelect,以及Over-lapped(events)三种模型.在书中测试的例子中,WSAAsyncSelect只是使用一个线程去处理所有的网络请求(表中写是使用3个线程,但由于主程序一个线程,界面一个线程,所以只剩下一个线程是处理网络请求的),但WSAEventSelect和Over-lapped(Events)两种模型,基本上是使用线程池(几十到上百线程)去处理所有网络请求.书中也有说WSAAsyncSelect模型因为不能及时地处理FD_ACCEPT事件导致很多连接不能接收到,以及因为太多消息要处理,造成了消息阻塞,平均的流量也是很不理想.但这真是WSAAsyncSelect模型本身问题吗?我在想,如果让WSAAsyncSelect模型一样使用线程池,象WSAEventSelect,以及Over-lapped(events)模型一样,使用几十到百多线程处理所有请求,结果会是怎样?测试结果在我意料之中,如果让WSAAsyncSelect()使用同样多的线程去处理所有网络请求,所有的性能数据都和Over-lapped(events)模型非常接近,哪怕只是使用1/4左右的线程,一样可以以稍高一点的CPU使用率,达到Over-lapped(events)模型的性能,对于这个结果,是意料之外,因为如果使用线程池的话,WSAAsyncSelect模型的性能是排在WSAEventSelect,以及Over-lapped(events)之上,但当只是使用单个线程处理很大量的连接量(5000以上),WSAAsyncSelect()模型的性能是很差的.除了IOCP这种异类的模型外,没有哪个模型是以可以使用很少的线程达到很高的性能.