基于线程池的网络程序性能分析
看到论坛里很多人一看见模型就是IOCP
我实在搞不明白,为什么要IOCP?有必要吗?一定要学吗?代价是多少?
MS虽然说了使用IOCP在WINDOWS下效率比较高,
但是只是个比较而已,相对于硬件的飞速发展,那点提高几乎可以忽略
况且使用IOCP,等于和LINUX/UNIX说GOODBYE,使用人家封装好的类,自己根本不懂原理是什么,
如何去为特定使用做优化,就好象现在还有人在问TCP粘包问题一样,最基本的东西还没搞清楚
使用WINSOCK API,完全可以自己实现类似的功能,为自己的应用而优化,通用不等于100%管用,不从底层实现做起,等你的软件做大了就会感到后怕
我比较喜欢用多线程来编写网络程序的,使用线程池技术,完全可以做到同样优秀的性能,而且代码简化,很多人可能一看到多线程,特别是上千个线程同时运行的时候,上下文切换动作就要占用很多时间了,实际上,相对于现在的硬件,特别是在WIN2003上,速度之快你无法想象,下面是我在 CELERON 700M(100*7) WIN2000 PRO环境下 模拟运算得到的结果
一共1500个线程[1M STACK 2*4KB DEFAULT]同时运行 ,每线程运行 1200次 ,每次 运算包括一个 内核加操作 2个用户态 除法和加法操作 ,全局变量操作 ,然后强制切换线程
得到的结果是: 每秒 WIN2000 PRO环境下可以切换 20万次 以上[包括了监控线程非常耗费CPU的界面输出操作], 其他操作依然响应正常
对于网络程序,采用阻塞的模式下,实际的每次切换操作到换出,CPU占用和我模拟的线程差距不大,
而现在的服务器处理器,基本都是几乎2G 1MCCHE以上,而且至少是DDR内存,在WIN2003下,速度更快,因为2003下为后台线程做了优化,特别是开启线程的速度,几乎是2000 PRO的10倍以上
所以,对于几千个连接,如果你不是绝对必要,完全没必要在乎使用什么模型
UNIX/LINUX下没有IOCP几十年,使用FORK用了几十年,造样在稳定运行并性能优秀,使用比进程要轻的多的线程,完全可以实现更加优秀的性能