单线程的socket发送效率高还是多线程呢? 大神一起来讨论

96掌门师兄 2013-06-21 10:32:31
加入在CPU和内存都一定并且足够的前提下,有一个队列里不断的有新的消息到来,然后我要将这个队列里的节点发送到另一台服务器上(有可能是本机),到底是使用多线程发送比较好,还是单线程呢?

多线程取消息队列里元素要加锁,发送的时候CPU要调度线程,是一个时间片消耗。单线程直接取到就发送,如果网卡空闲的话,是单线程的IO利用率高还是多线程的IO利用率高呢?就是一段时间里,谁发送的数据更多?
...全文
697 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrp_2010 2013-06-26
  • 打赏
  • 举报
回复
引用 12 楼 yao050421103 的回复:
如果想通过使用多线程来提高执行效率,那么必须满足如下条件: 1. 你的机器不能仅仅是单核的CPU 2. 并发执行的多个任务之间不能有依赖关系 这两个条件缺少任何一个,都不能达到你的目的。
Squall_zy 2013-06-26
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390335996 这个帖子里有一些实验数据。 实验目的不一样,数据仅供参考。 线程这东西,2个肯定比1个好,但1000个未必比100个好。 那到底多少个线程效率最高呢?这取决于你的环境(cpu、内存、网络带宽)。 当你的cpu、内存、网络带宽中的某一项达到瓶颈的时候,才能确定出这个最佳值。
wwwspider001 2013-06-25
  • 打赏
  • 举报
回复
引用 10 楼 xiaoxiaoyu85 的回复:
[quote=引用 9 楼 wwwspider001 的回复:] 这种只是转发,没有额外的处理,单线程,只要占用的cpu单核不打满,并且网络工作正常,就是单线程效率高 如果需要处理的时间长,肯定是多线程占优,比如把处理等同于Sleep很长时间
那么要是多核的话均有空闲的话,会不会多线程更快?[/quote] 我说的cpu单核不打满,不是说硬件是单核,说的是单线程只用cpu一个核,这个核处理速度足够快,网络收发也能处理过来的情况,单线程完全能够胜任。 一般是在单线程处理时cpu存在长时间等待,或者cpu忙不过来,任务又能并发处理的情况下使用多线程
96掌门师兄 2013-06-25
  • 打赏
  • 举报
回复
引用 9 楼 wwwspider001 的回复:
这种只是转发,没有额外的处理,单线程,只要占用的cpu单核不打满,并且网络工作正常,就是单线程效率高 如果需要处理的时间长,肯定是多线程占优,比如把处理等同于Sleep很长时间
那么要是多核的话均有空闲的话,会不会多线程更快?
wwwspider001 2013-06-25
  • 打赏
  • 举报
回复
这种只是转发,没有额外的处理,单线程,只要占用的cpu单核不打满,并且网络工作正常,就是单线程效率高 如果需要处理的时间长,肯定是多线程占优,比如把处理等同于Sleep很长时间
Sandrer 2013-06-25
  • 打赏
  • 举报
回复
如果是我的话,我会自己测试 问出来的未必是正确的,正确的未必写出来了
96掌门师兄 2013-06-25
  • 打赏
  • 举报
回复
引用 12 楼 yao050421103 的回复:
如果想通过使用多线程来提高执行效率,那么必须满足如下条件: 1. 你的机器不能仅仅是单核的CPU 2. 并发执行的多个任务之间不能有依赖关系 这两个条件缺少任何一个,都不能达到你的目的。
恩,明白了,多谢多谢。。。
yao050421103 2013-06-25
  • 打赏
  • 举报
回复
如果想通过使用多线程来提高执行效率,那么必须满足如下条件: 1. 你的机器不能仅仅是单核的CPU 2. 并发执行的多个任务之间不能有依赖关系 这两个条件缺少任何一个,都不能达到你的目的。
yao050421103 2013-06-25
  • 打赏
  • 举报
回复
使用多线程的本质原因在于并发地执行多个任务。典型的如UI线程和后台的逻辑线程。对于这种情况如果不单独启线程处理后台逻辑,UI将被阻塞,从而无法响应用户的操作。 回到楼主的问题,如果你在发送数据包的同时需要并发处理其他的任务(这个任务不能等到数据包发送完毕才处理,而是要一边发送一边处理),那么就用多线程,否则就没有必要用多线程。
  • 打赏
  • 举报
回复
如果说绝对效率,肯定单线程无疑问 多线程只是为了防止某个动作消耗大量时间片不放权 就像你在看优酷的时候又想下东西,那肯定要给迅雷一个线程 然后你既能看优酷又能下东西 多线程是个折中方案,如果我们的cpu足够快,可以将任何一堆指令都瞬间完成,那也就没必要多线程了
96掌门师兄 2013-06-21
  • 打赏
  • 举报
回复
引用 5 楼 lostying 的回复:
如果有锁应该是单线程好点,不考虑IO效率,首先多CPU和单CPU在锁面前就是等效的了,反正都要等锁。多线程多了任务的切换开销。个人感觉只有在需要对数据进行处理时,并且一般是收数据,处理速度达不到收取速度时才会考虑多线程。
恩,个人也觉得单线程好一些,。。。。
无言猪 2013-06-21
  • 打赏
  • 举报
回复
如果有锁应该是单线程好点,不考虑IO效率,首先多CPU和单CPU在锁面前就是等效的了,反正都要等锁。多线程多了任务的切换开销。个人感觉只有在需要对数据进行处理时,并且一般是收数据,处理速度达不到收取速度时才会考虑多线程。
sumos 2013-06-21
  • 打赏
  • 举报
回复
个人直觉,单线程。 多线程在同一个socket发送,必须加锁,线程切换也是问题。
Eleven 2013-06-21
  • 打赏
  • 举报
回复
引用 2 楼 xiaoxiaoyu85 的回复:
[quote=引用 1 楼 shootingstars 的回复:] 这个差不多吧。你的队列加锁只要不是太烂的话。。。 目前机器全速发送或者接收,瓶颈都是网卡速度。
恩,就是比较一下谁更高效。。。。[/quote] 自己写测试代码比较一下~
96掌门师兄 2013-06-21
  • 打赏
  • 举报
回复
引用 1 楼 shootingstars 的回复:
这个差不多吧。你的队列加锁只要不是太烂的话。。。 目前机器全速发送或者接收,瓶颈都是网卡速度。
恩,就是比较一下谁更高效。。。。
shootingstars 2013-06-21
  • 打赏
  • 举报
回复
这个差不多吧。你的队列加锁只要不是太烂的话。。。 目前机器全速发送或者接收,瓶颈都是网卡速度。
www_adintr_com 2013-06-21
  • 打赏
  • 举报
回复
如果你只是一个转发, 单线程的高. 如果涉及到数据的处理, 而且处理算法还比较耗时(比如加密什么的), 再加上你的 CPU 是多核的, 多线程就比单线程高了.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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