.NET C# Socket产品性能测试、性能对比报告(包含SuperSocket、HPSocket.Net、TouchSocket)

.NET C# Socket产品性能测试、性能对比报告(包含SuperSocket、HPSocket.Net、TouchSocket)

文章目录

一、说明二、待测试产品、环境2.1 Socket产品2.2 测试物理机

三、测试3.1 服务器测试项目配置3.2 TCP服务器测试参数配置3.3 测试一3.4 测试二3.5 测试三

四、综合功能及特性五、最后结语

一、说明

本测试结果仅供参考,可能由于设置、侧重的不同,导致测试结果有偏颇的,请联系若汝棋茗本人。QQ:505554090。测试的本意是进步学习,绝不是恶意诋毁,因为每个产品都有自己的侧重,每个用户都有自己选择的权力。所以本测试仅仅是将同类产品的最真实的成绩呈现给大家,让大家在选择的时候,心里也有个底。

二、待测试产品、环境

2.1 Socket产品

有其他建议请联系我

HPSocket.NetSuperSocketTouchSocket

项目SuperSocketHPSocket.NetTouchSocketGiteeGiteeGiteeGiteeGithubGithubGithubGithubGitee DemoDemoDemoDemoGithub DemoDemoDemoDemo

2.2 测试物理机

个人笔记本,戴尔G5,CPU:i7-10750H,六核12线程。RAM:8G。

三、测试

3.1 服务器测试项目配置

控制台 NET461项目 x64编译(因为HPSocket在Net461不支持Any CPU,而SuperSocket对于netcoreapp3.1有编译警告,所以权衡之下,取最优项目配置。)。

3.2 TCP服务器测试参数配置

【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();

【TouchSocket 】

版本:RRQMSocket 6.5.0(TouchSocket 改名前版本)

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】

【TouchSocket 】

总结:千次连接测试中,HPSocket性能突出,SuperSocket与TouchSocket 不相上下,可能还是因为HPSocket是基于C++缘故。但是总体差距不大,而且都在可接受范围内。 在内存方面,SuperSocket采用预分配策略,在刚启动时,就分配内存,但是在连接时,内存依然会上升,最终达98Mb。HPSocket在连接以后,内存达到25Mb,堪称内存模范。TouchSocket 在完成连接以后,内存上升至39Mb。 在CPU使用率方面,SuperSocket使用率最高,其次是TouchSocket ,HPSocket使用率最低。

3.4 测试二

建立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】

【TouchSocket 】

总结:万次连接,千次数据交互测试中,三者的差异也比较小,但无疑TouchSocket 夺得桂冠。 在内存方面,SuperSocket最终达243Mb,且GC极度频繁。HPSocket内存达到75Mb,因为接收逻辑使用C++,所以无GC问题。RRQMSocket内存上升至92Mb,GC少量释放,这是因为有内存池的缘故。 在接收效率方面,TouchSocket 夺得桂冠,其次是HPSocket。但是因为差距不大,所以也不排除计算机性能因素。

3.5 测试三

建立10个连接,然后每个连接使用独立线程发送10w次64K数据,服务器不做任何处理,检测服务器流量处理效率。

注意:本轮测试中,TouchSocket 需要修改一下BufferLength参数,因为该参数会作为申请内存池的基数,所以为避免内存碎片化,需要将BufferLength调整至(64Kb)。

【SuperSocket】 【HPSocket】

【TouchSocket 】

总结:10次连接,百万次64K数据交互测试中,三者的差异比较大,TouchSocket 夺得桂冠。 在内存方面,SuperSocket最终达322Mb,且GC极度频繁,且在测试过程中,极不稳定,尝试测试两次,都没有完成测试。HPSocket内存达到17Mb,因为接收逻辑使用C++,所以无GC问题,但是耗时30秒之多。TouchSocket 内存上升至31Mb,在传输速度达到2.6G时,GC也是少量释放,都应该归功于内存池。

四、综合功能及特性

功能SuperSocketHPSocket.NetTouchSocket开源是是是免费商业是是是.Net 跨平台性正式版不完全具备,Bate版支持依托C++支持基本完全支持完全跨平台性依托.Net Core跨平台依托C++跨平台依托.Net Core跨平台依赖程度依赖较严重无依赖无依赖应用限制基本无限制受限与不同CPU类型的运行版本,从而不适合UWP转换打包等基本无限制问题生态链比较完整,遇到问题能很快百度到比较完整,遇到问题能很快百度到新出时间较短,直接搜索比较困难,但是可以直接提Issue解决是否有视频新手教程无官方教程无官方教程B站有视频二次开发容易程度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐代码规范度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐文档完整度⭐⭐⭐⭐⭐⭐⭐⭐

五、最后结语

因为我是TouchSocket 的作者,所以难免会对自家产品有诸多赞扬,但是实际上我知道,TouchSocket 还有很长的路要走,好的产品只有经过时间和更多人的考验,才能淘沙出金。所以希望本篇测评,能该您一个建议,也能给TouchSocket 一个机会。下次选择Socket的时候,可以考虑一下TouchSocket 哦。

相关推荐

黑马简介 365bet取款要多久到账

黑马简介

📅 06-27 👁️ 2967
狼獾大战蜜獾:谁才是动物界的硬核之王? 365bet取款要多久到账

狼獾大战蜜獾:谁才是动物界的硬核之王?

📅 06-28 👁️ 4969
世界杯夺冠次数排名 历届世界杯冠军名单大全 365bet取款要多久到账

世界杯夺冠次数排名 历届世界杯冠军名单大全

📅 06-27 👁️ 8024