socket的同步与异步之间的效率差距是有多大?

JamesWatson 2014-07-02 10:05:42
linux epoll的et模式与posix aio还有windows IOCP比较,效率上能差多少?aio和IOCP要给每个连接分派缓冲区,是不是在大数据、多连接、低并发的时候表现很差阿?费内存还容易丢数据?而且*nix对aio的支持好像一直都不是很好的样子
...全文
612 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
玄之丞 2014-07-10
  • 打赏
  • 举报
回复
引用 16 楼 mujiok2003 的回复:
建议在asio(standalone版的boost::asio)和libev之间选择,没有必要重头开始做。 个人比较喜欢asio. 性能差别很大部分原因在于: 能否针对具体案例正确使用lib应用。
支持层主,boost ASIO很好,很舒服。
JamesWatson 2014-07-09
  • 打赏
  • 举报
回复
引用 16 楼 mujiok2003 的回复:
建议在asio(standalone版的boost::asio)和libev之间选择,没有必要重头开始做。 个人比较喜欢asio. 性能差别很大部分原因在于: 能否针对具体案例正确使用lib应用。
asio和libev是在哪种许可证下发布的?LGPL?
mujiok2003 2014-07-09
  • 打赏
  • 举报
回复
引用 17 楼 xosion 的回复:
[quote=引用 16 楼 mujiok2003 的回复:] 建议在asio(standalone版的boost::asio)和libev之间选择,没有必要重头开始做。 个人比较喜欢asio. 性能差别很大部分原因在于: 能否针对具体案例正确使用lib应用。
asio和libev是在哪种许可证下发布的?LGPL?[/quote] asio: the Boost Software License. libev
mujiok2003 2014-07-05
  • 打赏
  • 举报
回复
建议在asio(standalone版的boost::asio)和libev之间选择,没有必要重头开始做。 个人比较喜欢asio. 性能差别很大部分原因在于: 能否针对具体案例正确使用lib应用。
JamesWatson 2014-07-05
  • 打赏
  • 举报
回复
谁能告诉我应该选epoll还是aio啊?
JamesWatson 2014-07-04
  • 打赏
  • 举报
回复
我没写具体实现的代码,因为我不知道要选aio还是epoll,所以不要说效率取决于我的实现,aio和epoll又不是我编的。
C_peter 2014-07-04
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
同意!赵老师终于不再贴同一段代码了!哈哈
就想叫yoko 2014-07-04
  • 打赏
  • 举报
回复
引用 10 楼 xosion 的回复:
我想先做一个处理并发连接的组件,像Libevent那样的东西,不考虑上层协议,以便于降低耦合性。生产者把文件描述符交给消费者就完事,消费者去接收处理数据,消费者一直为这个客户提供服务直到resv失败。
是,收的应用层buffer确实可以留给上层做 但是发的就少不了了,因为你调用send4096个字节的时候,你也不知道它会send出去多少
汗晕倒 2014-07-04
  • 打赏
  • 举报
回复
不好说,真实的场景对比才有具体结果
zilaishuichina 2014-07-03
  • 打赏
  • 举报
回复
效率不会差太多 真正提升效率的,多架几台机器,分摊客户端连接,不同的机器处理不同的客户端请求 比如前面架10台login服务器, 客户端按ip段连不同的机器登陆 登陆上之后,假设客户端有 增、删、改、查 4种业务逻辑需求 后面架4台机器,分别处理不同的业务逻辑 后面的4台业务逻辑服务器,和前面的10台login服务器,之间多对多连接
赵4老师 2014-07-03
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
JamesWatson 2014-07-03
  • 打赏
  • 举报
回复
我用epoll的时候是搭线程池,所以用于接收数据的缓冲区数量上和池中线程数等同,比每个fd一个buffer还是能剩很多。 广集群是怎么设计的?是一个路由进程负责告诉客户机要连接哪台服务器,后面n台服务器提供服务?
就想叫yoko 2014-07-03
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
其实,怎么也抵不上多几台服务器分布式并行。 单机上的东西,再怎么折腾,都只是算玩弄小技巧了。
iocp我没用过,据说效率更高 差得不大,要差大了是用法问题,我见识过不少写iocp的人,写到最后自己绑的void*还要延迟5分钟释放。也不晓得是他们hold不住还是就该这么用。。。 但说回来,你用epoll,socket的buffer少不了,鉴于tcp的流形式,你应用层的buffer也是少不了的啊 另外1楼其实说得有道理的 现在很多互联网的产品都是广集群啊,每个点的带宽都很小,带宽成本也很低,而程序员成本那么高,产品的可维护性以及可扩展性往往更重要 当然,一线互联网的核心产品除外,那种你要能提升个10%的性能产生的效益就高了去了 贴个epoll库广告啊 https://github.com/fasttodie/chef
jmppok 2014-07-03
  • 打赏
  • 举报
回复
不好说,要看怎么调用,什么场景。
JamesWatson 2014-07-03
  • 打赏
  • 举报
回复
我想先做一个处理并发连接的组件,像Libevent那样的东西,不考虑上层协议,以便于降低耦合性。生产者把文件描述符交给消费者就完事,消费者去接收处理数据,消费者一直为这个客户提供服务直到resv失败。
就想叫yoko 2014-07-03
  • 打赏
  • 举报
回复
引用 6 楼 xosion 的回复:
我用epoll的时候是搭线程池,所以用于接收数据的缓冲区数量上和池中线程数等同,比每个fd一个buffer还是能剩很多。 广集群是怎么设计的?是一个路由进程负责告诉客户机要连接哪台服务器,后面n台服务器提供服务?
你收的数据是什么,用的什么协议,总得解决tcp粘包的问题吧
The_Third_Wave 2014-07-02
  • 打赏
  • 举报
回复
mark下,同样不清楚。
JamesWatson 2014-07-02
  • 打赏
  • 举报
回复
如果每台服务器都能通过“小技巧”提供优质的服务,那么不仅可以节约资源,形成的集群也是优秀的。
taodm 2014-07-02
  • 打赏
  • 举报
回复
其实,怎么也抵不上多几台服务器分布式并行。 单机上的东西,再怎么折腾,都只是算玩弄小技巧了。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧