- 一、说明
- 二、待测试产品、环境
- 2.1 Socket产品
- 2.2 测试物理机
- 三、测试
- 3.1 服务器测试项目配置
- 3.2 TCP服务器测试参数配置
- 3.3 测试一
- 3.4 测试二
- 3.5 测试三
- 四、综合功能及特性
- 五、最后结语
一、说明
二、待测试产品、环境 2.1 Socket产品本测试结果仅供参考,可能由于设置、侧重的不同,导致测试结果有偏颇的,请联系若汝棋茗本人。QQ:505554090。测试的本意是进步学习,绝不是恶意诋毁,因为每个产品都有自己的侧重,每个用户都有自己选择的权力。所以本测试仅仅是将同类产品的最真实的成绩呈现给大家,让大家在选择的时候,心里也有个底。
有其他建议请联系我
- HPSocket.Net
- SuperSocket
- RRQMSocket
| 项目 | SuperSocket | HPSocket.Net | RRQMSocket |
|---|---|---|---|
| Gitee | Gitee | Gitee | Gitee |
| Github | Github | Github | Github |
| Gitee Demo | Demo | Demo | Demo |
| Github Demo | Demo | Demo | Demo |
三、测试 3.1 服务器测试项目配置个人笔记本,戴尔G5,CPU:i7-10750H,六核12线程。RAM:8G。
3.2 TCP服务器测试参数配置控制台 NET461项目 x64编译(因为HPSocket在Net461不支持Any CPU,而SuperSocket对于netcoreapp3.1有编译警告,所以权衡之下,取最优项目配置。)。
【SuperSocket】
版本:SuperSocket.Engine 1.6.6.1
AppServer appServer = new AppServer();
var config = new SuperSocket.SocketBase.Config.ServerConfig()
{
ClearIdleSession = true, //60秒执行一次清理90秒没数据传送的连接
ClearIdleSessionInterval = 60,
IdleSessionTimeOut = 90,
MaxRequestLength = 1024*64, //最大包长度
Ip = "Any",
Port = 7789,
ListenBacklog = 1000,
MaxConnectionNumber = 10000,
};
appServer.Setup(config);
appServer.Start();
【HPSocket】
版本:HPSocket.Net 5.8.5.5
TcpServer tcpServer = new TcpServer(); tcpServer.MaxConnectionCount = 10000; tcpServer.SocketListenQueue = 1000; tcpServer.Port = 7789; tcpServer.Start();
【RRQMSocket】
版本:RRQMSocket 6.5.0
BytePool.SetBlockSize(1024, 1024 * 1024 * 10);//重新指定内存池最大、最小值分配。
TcpService service = new TcpService();
var config = new TcpServiceConfig();
config.ListenIPHosts = new IPHost[] { new IPHost("127.0.0.1:7789")};
config.MaxCount = 10000;
config.BufferLength = 1024;
//config.BufferLength = 1024*64;//此处设置在测试流量时生效
config.Backlog = 1000;
service.Setup(config);
service.Start();
3.3 测试一
每次建立1000连接,然后释放,持续执行10次,达10000连接。
【客户端代码】
static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7789);
static Socket GetSocket()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
return socket;
}
static void Test01()
{
TimeSpan time = TimeSpan.Zero;
for (int i = 0; i < 10; i++)
{
TimeSpan timeSpan = RRQMCore.Diagnostics.TimeMeasurer.Run(() =>
{
List sockets = new List();
for (int j = 0; j < 1000; j++)
{
sockets.Add(GetSocket());
}
foreach (var item in sockets)
{
item.Dispose();
}
});
time += timeSpan;
Console.WriteLine(timeSpan);
}
Console.WriteLine($"总用时:{time}");
}
【SuperSocket】
【HPSocket.Net】
【RRQMSocket】
3.4 测试二总结:千次连接测试中,HPSocket性能突出,SuperSocket与RRQMSocket不相上下,可能还是因为HPSocket是基于C++缘故。但是总体差距不大,而且都在可接受范围内。
在内存方面,SuperSocket采用预分配策略,在刚启动时,就分配内存,但是在连接时,内存依然会上升,最终达98Mb。HPSocket在连接以后,内存达到25Mb,堪称内存模范。RRQMSocket在完成连接以后,内存上升至39Mb。
在CPU使用率方面,SuperSocket使用率最高,其次是RRQMSocket,HPSocket使用率最低。
建立10000连接,然后每1000连接为一组,每组使用独立线程持续发送1000次数据,每次发送10byte。
【客户端代码】
static void Test02()
{
stopwatch = new Stopwatch();
List> socketsCollection = new List>();
for (int i = 0; i < 10; i++)
{
List sockets = new List();
for (int j = 0; j < 1000; j++)
{
sockets.Add(GetSocket());
}
socketsCollection.Add(sockets);
}
stopwatch.Start();
foreach (var item in socketsCollection)
{
SocketSend(item);
}
}
static void SocketSend(List sockets)
{
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Task.Run(() =>
{
TimeSpan timeSpan = RRQMCore.Diagnostics.TimeMeasurer.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
try
{
foreach (var item in sockets)
{
item.Send(data);
}
}
catch (Exception ex)
{
Console.WriteLine($"异常退出,{ex.Message}");
break;
}
}
});
ShowTime(timeSpan);
});
}
static Stopwatch stopwatch;
static void ShowTime(TimeSpan timeSpan)
{
Console.WriteLine($"当前用时:{timeSpan},当前总用时:{stopwatch.Elapsed}");
}
【SuperSocket】
【HPSocket】
【RRQMSocket】
3.5 测试三总结:万次连接,千次数据交互测试中,三者的差异也比较小,但无疑RRQMSocket夺得桂冠。
在内存方面,SuperSocket最终达243Mb,且GC极度频繁。HPSocket内存达到75Mb,因为接收逻辑使用C++,所以无GC问题。RRQMSocket内存上升至92Mb,GC少量释放,这是因为有内存池的缘故。
在接收效率方面,RRQMSocket夺得桂冠,其次是HPSocket。但是因为差距不大,所以也不排除计算机性能因素。
建立10个连接,然后每个连接使用独立线程发送10w次64K数据,服务器不做任何处理,检测服务器流量处理效率。
注意:本轮测试中,RRQMSocket需要修改一下BufferLength参数,因为该参数会作为申请内存池的基数,所以为避免内存碎片化,需要将BufferLength调整至641024。*
【SuperSocket】
【HPSocket】
【RRQMSocket】
四、综合功能及特性总结:10次连接,百万次64K数据交互测试中,三者的差异比较大,RRQMSocket夺得桂冠。
在内存方面,SuperSocket最终达322Mb,且GC极度频繁,且在测试过程中,极不稳定,尝试测试两次,都没有完成测试。HPSocket内存达到17Mb,因为接收逻辑使用C++,所以无GC问题,但是耗时30秒之多。RRQMSocket内存上升至31Mb,在传输速度达到2.6G时,GC也是少量释放,都应该归功于内存池。
| 功能 | SuperSocket | HPSocket.Net | RRQMSocket |
|---|---|---|---|
| 开源 | 是 | 是 | 是 |
| 免费商业 | 是 | 是 | 是 |
| .Net 跨平台性 | 正式版不完全具备,Bate版支持 | 依托C++支持 | 基本完全支持 |
| 完全跨平台性 | 依托.Net Core跨平台 | 依托C++跨平台 | 依托.Net Core跨平台 |
| 依赖程度 | 依赖较严重 | 无依赖 | 仅依赖RRQMCore |
| 应用限制 | 基本无限制 | 受限与不同CPU类型的运行版本,从而不适合UWP转换打包等 | 基本无限制 |
| 问题生态链 | 比较完整,遇到问题能很快百度到 | 比较完整,遇到问题能很快百度到 | 新出时间较短,直接搜索比较困难,但是可以直接提Issue解决 |
| 是否有视频新手教程 | 无官方教程 | 无官方教程 | B站有视频 |
| 二次开发容易程度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 代码规范度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 文档完整度 | ⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐ |
因为我是RRQMSocket的作者,所以难免会对自家产品有诸多赞扬,但是实际上我知道,RRQMSocket还有很长的路要走,好的产品只有经过时间和更多人的考验,才能淘沙出金。所以希望本篇测评,能该您一个建议,也能给RRQMSocket一个机会。下次选择Socket的时候,可以考虑一下RRQMSocket哦。
本次测试源码:RRQMPerformanceTest



