Socket-Vs-WebSocket-TestTool
项目地址 : https://github.com/kelin-xycs/Socket-Vs-WebSocket-TestTool
Socket-Vs-WebSocket-TestTool
一个用 C# 写的 Socket 和 WebSocket 性能测试工具
这个项目不是计划内的 。 我要 呵呵 了 。 因为 QQ 群里有网友提到 “WebSocket 的效率比 Socket 低” , 所以就想看一下实际情况到底怎么样 。
解决方案 里 包含 4 个项目, SocketTest , SocketTestTool , WebSocketTest , WebSocketTestTool 。
SocketTest : Socket 测试的服务器端
SocketTestTool : Socket 并发测试工具
WebSocket : WebSocket 测试的服务器端
WebSocketTestTool : WebSocket 并发测试工具
测试原理 : 测试工具发送 2 Byte 的数据 “aa” 到 服务器端 , 服务器端收到数据后回发这 2 Byte 的数据给测试工具,测试工具接收到回发数据算一次请求完成 。 本次请求完成后才会发出下一次请求 。
测试结果 :
Socket : 每秒请求数最高可达到 25000 , CPU 占用率 : 测试工具 15% , 服务器端 22% , System进程 27%
WebSocket : 每秒请求数最高可达 7500 - 8000 , CPU 占用率 : 测试工具 30% , 服务器端 48% , System进程 7%
注 : System 进程 应该就是 Win Socket 工作线程所在的进程 。
从这组测试数据看起来 , WebSocket 的效率大概是 Socket 的 1/3 - 1/4 之间 。
有一个现象值得注意 : 在测试中 , Socket 组 的 CPU 占用率普遍低于 WebSocket 组 , 还有一点 , Socket 测试中 CPU 占用率最高的是 System 进程 , 而 WebSocket 测试中 CPU 占用率 最高的是 服务器端 进程 , 并且 System 进程的 CPU 占用率 最低 和 很低 。
好的 , 上面是测试结果 。
下面对 测试工具 和 服务器端 程序作一些说明 :
WebSocketTest.exe 需要 “以管理员身份运行” , 不然会报 “拒绝访问” 的异常 。
测试工具 界面上有一个 文本框 “连接数” , 默认值 是 800 。
还有一个 文本框 “线程数” , 这个文本框的默认值是 4 , “线程数” 的 意思是 用于发送测试请求 的 线程数 ,通常设定为和 CPU 的 核数 相同即可 (可以把 虚拟线程(超线程) 算进去) 。 发送请求的线程数太多的话 , 会占用过多的 CPU 资源 , 同时 测试表现 会下降 。
还有一个 文本框 “发送内容” , 默认值是 “aa” , 目前 服务器端 的 程序 写死只接收 2 Byte 的数据 , 如果要发送更长的内容 , 服务器端 程序 需要相应的作一些修改 , 不然超出 2 Byte 的数据会在 Socket 和 WebSocket 的 缓冲区 里 堆积 起来 。
这次还发现了一些有趣的东西 :
async await 有些鸡肋 。 Thread , Monitor , Task , Task.Wait() 可以很好的完成 异步工作 。 async await 增加了 语言 的 复杂性 和 目标代码 的 复杂性 。 希望通过 async 一个 关键字 就能使一个 普通方法 变成 异步方法 , 这个想法很好 。 通过 await 来完成 等待异步调用 的 设计也很好 。 但 async 和 await 两者 应该可以单独使用 , 彼此之间不必有关联 。 这样的话 , 用 async 关键字就可以很容易的使一个方法变成 异步方法 , 而用 await 也可以很方便的 等待 异步方法 的 调用 。 两者之间不必有什么关联 。 实际上 , async await 要解决的 ,或者说 适合解决 的 一个场景 是 AJAX 里 充满异步调用 的 场景 。 在 AJAX 里 , 几乎每个事件都有 异步调用 , 每个 事件函数 都 对应 回调函数 , 只要有和服务器的交互的话 。 async await 可以来解决这样的场景 。 让 AJAX 事件函数里访问服务器的 WebApi 和 后端代码里访问 数据库 一样 , 同步执行 , 顺序执行 。 但 async await 之间不必有关联 。 实际上 , async 方法里 必须 有 await 正是 async await 的 败笔 所在 。
从这个项目中 , 我们再次体会到 , 测试 是 一个 专业 , 是 和 开发 不可分割 的 一部分 , 和 开发 一起组成 软件生产力 。 测试 是 DevOps 的 主干力量 。
Socket-Vs-WebSocket-TestTool的更多相关文章
- C# Socket 实现WebSocket服务器端
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- TCP UDP socket http webSocket 之间的关系
---恢复内容开始--- OSI&TCP/IP模型 要弄清tcp udp socket http websocket之间的关系,首先要知道经典的OSI七层模型,与之对应的是TCP/IP的四层模 ...
- Socket与WebSocket以及http与https重新总结
Socket与WebSocket以及http与https重新总结 一.Socket 网络中的Socket是一个抽象的接口 ,而是为了方便使用TCP或UDP而抽象出来的一层 ,可以理解为网络中连接的两端 ...
- Http、Socket、WebSocket之间联系与区别
WebSocket和Socket区别 可以把WebSocket想象成HTTP(应用层),HTTP和Socket什么关系,WebSocket和Socket就是什么关系. HTTP 协议有一个缺陷:通信只 ...
- Hosting socket.io WebSocket apps in IIS using iisnode
In this post I explain how to configure a socket.io node.js application to use of WebSockets when ho ...
- PHP Socket实现websocket(一)基本函数介绍
WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 一开始的握手需要借助HTTP请求完成. WebSocket是基于TCP来实 ...
- Socket 与 WebSocket
本文转载自:http://zengrong.net/post/2199.htm 1. 概述 选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较.最常见的,就是需要比 ...
- 9、socket.io,websocket 前后端实时通信,(聊天室的实现)
websocket 一种通信协议 ajax/jsonp 单工通信 websocket 全双工通信 性能高 速度快 2种方式: 1.前端的websocket 2.后端的 socket.io 一.后端so ...
- socket.io websocket
不能不知道的事: 在Http协议中,客户端向服务器端发送请求,服务器端收到请求再进行回应,整个过程中,服务器端是被动方,客户端是主动方: websoket是H5的一种基于TCP的新通信协议,它与Htt ...
- socket、WebSocket
WebSocket 协议本质上是一个基于TCP的协议,它由通信协议和编程API组成,WebSocket能够在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通信能力. socket本质 ...
随机推荐
- vuecli3 引入script 针对没有cmd amd require等方式的js
最近做高德开发,需要引入高德的js,但是 说实话 高德官方的文档不知道大佬们有没有看懂,反正我是没看懂,写的都什么鬼?我怎么引都引入不了,迫不得已想到了如下方法: 一.准备一个能够在页面中插入js的方 ...
- 二叉树—-1(No.9HN省赛小题)
题目: 1013: Prototypes analyze 时间限制: 1 Sec 内存限制: 128 MB提交: 6 解决: 4[提交][状态][讨论版] 题目描述 ALpha Ceiling M ...
- Android studio的 repositories配置多个url
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...
- dubbo为consumer创建代理
ReferenceConfig.init()方法中获取到了最终的代理对象,先观察一下代理对象的视图. 默认使用javassist生成动态类,可配置proxy为jdk,则使用jdk动态代理: <d ...
- python 利用quick sort思路实现median函数
# import numpy as np def median(arr): #return np.median(arr) arr.sort() return arr[len(arr)>>1 ...
- learning uboot switch to standby system using button
pseudocode: If(reset_button was pressed ) { Change uboot env bootslot^1 }
- 最全的CSS浏览器兼容问题【CSS技巧 】
CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...
- Python Django 前后端数据交互 之 HTTP协议下GET与POST的区别
99%的人都理解错了HTTP中GET与POST的区别(转自知乎) 作者:Larry链接:https://zhuanlan.zhihu.com/p/22536382来源:知乎著作权归作者所有.商业转 ...
- 数据结构(C语言)关于树、二叉树、图的基本操作。
1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...
- DevExpress v17.2新版亮点——CodeRush篇(二)
用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了CodeRush v17.2 的新功能,快来下载试用新版本! 支持XAML 标记扩 ...