前端时间学些java的socket编程,学到了tcp和udp协议,众所周知tcp要比udp快,但是快多少呢?周末时间写代码验证一下:
代码就不贴了,最后我把代码上传到csdn上,有兴趣的同学可以看下,自己也算是留个记录
两个主要的测试类:TestUdpAndTcp和TestUdpAndTcpForClient(原来想在一个类(进程)里实现测试,但是测试结果很不理想,最后分析发现我开了100个线程的线程池,有概率会出现100个线程全是客户端或服务端线程,就一直卡死在接收消息上了。。)
6种情况:
/**
* udp和tcp的代码都有了,接下来就是测试tcp和udp的效率了
* 分别用线程池开20个线程,测试三种情况:
* 情况1:1个tcp服务端,10000个客户端分别发送消息
* 情况2:1个tcp服务端,100个客户端发送100次消息
* 情况3:1个tcp服务端,1个tcp客户端发送10000次消息
* 情况4:1个服务端,10000个udp客户端发送1次消息
* 情况5:1个服务端,100个udp客户端发送100次消息
* 情况6:1个服务端,1个udp客户端发送10000次消息
* 每次服务端收到消息之后发送回应
*/
最后的结果:
情况1:382ms
情况2:278ms
情况3:2463ms
情况4:37ms
情况5:38ms
情况6:34ms
结果分析:因为是本地的服务器和本地的客户端,所以几乎不存在网络传输的延迟,可以看到udp确实比tcp快很多(有着数量级上的差距)
情况4,5,6的时间消耗差不多,猜测两个原因: 1. 多线程情况下对udp消息发送提升并不明显,因为服务端没有对数据进行任何处理即返回,所以udp时间消耗可能跟创建线程消耗差不多,如果服务端收到消息后进行逻辑处理或者等待一定时间,那多线程肯定提升就会很明显了;2. udp是无状态的协议,所以每次客户端发送消息都会新建udp的协议包,这种情况下服务端无法做到线程复用(因为对服务端来说,每次链接都是一个新的链接)
情况1是10000个客户端,每个客户端每次发送一条消息,情况2是100个客户端,每个客户端一共发送100条消息,可以把问题简化,假设开线程是没有任何损耗的,100个线程也可以完美进行并发的,情况1可以简化为一个线程开100个客户端,每个客户端每次发送1条消息,情况2简化为1个线程开1个客户端,然后这个客户端发送100条消息,可以看出情况2应该比情况1少了部分客户端创建连接的消耗,所以情况2会比情况1时间消耗少一些,至于情况3,主要是因为多线程完全没有被利用,100个线程全程只有1个线程在工作,所以时间消耗最大。
以上分析只是个人理解,欢迎大神指正!