.NET平台下几种SOCKET模型的简要性能供参考
这个内容在cnblogs中也讨论过很多次了,这两天大概看了一些资料,看到一些简单的性能指标拿出来和大家讨论一下。
socket + threads/threadpool
大概性能:小于1500个连接
实现:accept一个socket,就交给一个线程去管理,比较笨,但也比较有效,因为是同步方式,控制起来很方便。高级点的,就是交给一个线程池去管理,线程池由系统自动托管,省去了开销线程的时间。一般小型项目,用这个完全足够,开发也简单。但要注意,如果若干socket长时间占用线程池中的线程,同时其它连接数又比较多,很容易出现提示说你没有足够的线程供使用。呵呵,让socket少做点事,少占用时间,换一个快点的cpu是不错的方式。另外,如果有一些比较好的第三方线程池组件,也可以选择使用,比如smartthreadpool。
socket + select
大概性能:大于1500个连接后性能下降
实现:select是很常用的一种模型。是在阻塞功能中轮询一个或多个socket,将要处理的socket放到一个ilist中,当select轮询结束后,然后我们再自己处理这个ilist中的socket。具体的用法可以看一下msdn。select的效率并不能说是高的,因为当队列中待处理的socket比较多的时候,处理最后几个socket相当于要遍历所有前面的socket,非常不划算的。
socket + asynchronous
大概性能:约7500个客户端连接
实现:beginxxxx,endxxxx,再熟悉不过了吧。异步socket归根到底,还是用的线程池技术,用线程池来处理异步io。这就又引出个问题,.net的线程池又是用的什么实现方式,以前看过有人说,.net的线程池是用的完成端口来实现的,我不知道这样的说法是不是正确,从查到的资料中也没有办法确认(希望这点有朋友可以告诉我)。异步socket对于程序的处理流程来说比同步复杂了许多,异步回调函数的控制不如同步方式那样直观。但有一点我想应该是要注意的,就是回调函数应该轻装上阵,不应该处理过多的事务,对传递数据的处理,应该交给其它线程进行处理。
iocp(完成端口)
大概性能:约20000~50000个客户端连接
实现:现在.net下有一些伪iocp,大家可以去搜索一下,还没有见过开放出来的用这些伪iocp来实现的socket例子。我说的20000~50000个客户端连接,是指在c++下开发的情况,这样的情况下,需要用到的基本技术还包括内存池、查询算法等。
伪iocp能实现多少最大连接,没有资料可以查,如果有朋友知道,可以讨论一下。另外上面提到的许多数据,是从一些资料上摘抄下来的,我没有自己试过,仅仅是拿出来和大家讨论一下。我想,一个高性能的服务端程序,可能需要的技术不仅仅是采用什么模型,还有许多细节需要注意,比如内存的处理,采用什么算法等等,当然,这仅仅是软件成本上的,硬件上肯定也是需要投入的。
- · 使用 XML 模板 (MSSQL手册)
- · 使用带批注的 XDR 架构创建 XML 视图
- · 在XPath查询中指定轴(转自MSSQL手册)
- · JavaScript极速狂飙:CSS样式表的背景渲染效率
- · javascript应用:实现复选框全选/全不选切换
- · JavaScript极速狂飙:大容量字符型数组的快速检索
- · JavaScript极速狂飙:组合拼接字符串的效率
- · 图片自动缩小的js代码,用以防止图片撑破页面
- · PHP漏洞中的战争
- · automation服务器不能创建对象
- · Oracle数据库的备份及恢复策略研究
- · PHP程序加速探索之脚本执行速度测试
- · PHP中路径问题的解决方案
- · 学以致用 驳“ASP低能论”
- · 另类扩展名同样执行ASP
- · 语言决不是语法的不同之.NET 版本计算表达式的值
- · ASP中实现的类似URLEncode的编码函数及对应解码函数
- · 数据对象扩展成默认组件 PHP开发小组发布PHP5.1.0
- · ASP.NET 揭秘 ASP.NET页面的结构
- · 关于Sql server数据库日志满的快速解决办法
- · PHP+MySQL分页显示示例分析
- · ORACLE SQL性能优化系列(九)
- · ORACLE SQL性能优化系列(七)
- · ORACLE SQL性能优化系列(八)
- · JSP渐进学习教程4
- · ORACLE SQL性能优化系列(三)
- · ORACLE SQL性能优化系列(二)
- · ORACLE SQL性能优化系列(四)
- · ORACLE SQL性能优化系列(五)
- · ORACLE SQL性能优化系列(六)
- · ORACLE SQL性能优化系列(一)
- · JSP渐进学习教程7
- · JSP渐进学习教程6
- · JSP渐进学习教程5
- · JSP渐进学习教程9
- · JSP渐进学习教程8
- · 用多活动结果集优化ADO.NET2.0数据连接
- · PHP 5.0 的变化与PHP 6.0 展望
- · C#中从HTML生成DOM TreeView的代码
- · C#下从HTML文件生成DOM树
- · JSP渐进学习教程1
- · JSP渐进学习教程2
- · C#中的委托与事件[翻译]
- · 2分法-通用存储过程分页(top max模式)版本
- · 怎样获得Sqlserver 2000得实例列表和运行在一个实例上得数据库列表
- · 利用WWF进行ASP.NET程序开发
- · ASPImage组件的实现过程
- · Asp.net(c#)实现多线程断点续传
- · .NET中书写XML的一种简单方法
- · ASP.Net项目出错处理方法汇总
- · php中实现多线程
- · 用ASP实现开关IIS不重启电脑
- · 利用ASP发送和接收XML数据的处理方法
- · XMLHTTP对象应用开发初体验
- · 剖析ASP.NET2.0导航功能之控制地图信息
- · SQL Server 2005上市 竞争者称无新意
- · 利用XMLBean轻轻松松读写XML
- · SQL Server 2005 全新的数据整合服务
- · AMD与微软结盟推出Microsoft SQL Server 2005
- · PHP经典的给图片加水印程序

