mono,.net,异步socket

.net的异步 socket有两种形式

 

1,和其他async io类似的 iasyncresult

 

2,3.5后新增的socketasyncargs。。

 

据msdn说 第二种的性能有极大的提高。。我简单测试过。。在 accept socket这里,,速度是很快,大约为前者的3-4倍

 

测试环境 win xp sp3

前者 1秒钟大约能accept 500个socket

 

后者 可以达到 2000个。。

 

在处理数据收发 方面 两者的开销差不多,没有表现出特别明显的差异。。。

 

但是在mono上就不是这么一回事了。。。mono 2.6.x后也多了一个 socketasyncargs的实现。但是文档是没有的。。iasyncresult 有文档。。描述和msdn大致上差不多。。。

 

在mail-list上有人提过mono上的socketasyncargs是用thread来对应每一个请求性能很低 云云。。再进一步的资料就没有了,于是决定一试

 

测试环境 ubuntu 9.10 desktop.. mono是从svn下的。2.8 preview的版本。

 

默认的 ulimit -n 是 1024.。

 

iasyncresult 可以连接到1019.。然后报描述符溢出。。正常

 

socketasyncargs 只能连接到501 左右。。

 

修改 ulimit -n 到 12000。。测试 10000个 长连接

 

iasyncresult 可以正常工作。。 socketasyncargs 在连接到8601的时候 直接退出 报了一个assert 声明。。具体是什么没看。

 

由此推断。。socketasyncargs在mono上 没有使用到epoll,实现上也存在问题。。。

 

我看过 ice 3.4.1的代码,.net版本依然 还是使用 iasyncresult 并没有因为 socketasyncargs高效而替代。我想很有可能是为了兼容mono的原因。。。

 

如果要写一个跨平台的基于.net async socket server 建议还是使用 iasyncresult。。。

你可能感兴趣的:(.net,socket,SVN,ubuntu,XP)