.NET C# Socket产品性能测试、性能对比报告(包含SuperSocket、HPSocket.Net、TouchSocket)-程序员宅基地

技术标签: TouchSocket  c#  github  工具技巧  .net  


一、说明

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

二、待测试产品、环境

2.1 Socket产品

有其他建议请联系我

  • HPSocket.Net
  • SuperSocket
  • TouchSocket
项目 SuperSocket HPSocket.Net TouchSocket
Gitee Gitee Gitee Gitee
Github Github Github Github
Gitee Demo Demo Demo Demo
Github Demo Demo Demo Demo
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<Socket> sockets = new List<Socket>();
            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<List<Socket>> socketsCollection = new List<List<Socket>>();
    for (int i = 0; i < 10; i++)
    {
    
        List<Socket> sockets = new List<Socket>();
        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<Socket> 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也是少量释放,都应该归功于内存池。

四、综合功能及特性

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

五、最后结语

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40374647/article/details/122454061

智能推荐

华为再回应“清理34岁以上员工”传言,程序员如何应对“35岁危机”?_华为35岁退休制度-程序员宅基地

文章浏览阅读1.9w次,点赞35次,收藏68次。华为常务监事陈黎芳:“前些年,网上有关于华为34岁以上员工的一些传言,都是不准确的。”_华为35岁退休制度

linux7yum配置后使用报错,Centos7 使用yum安装MariaDB 10.1(报错缺少依赖的解决情况,报错信息贴在最后)-Go语言中文社区...-程序员宅基地

文章浏览阅读1.6k次。1.创建 MariaDB yum 仓库官方教程截图:1.1 根据教程提示,创建MariaDB.repo 写入以下内容并保存:vi /etc/yum.repos.d/MariaDB.repo[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.1/centos7-amd64gpgkey=https://yum.mariadb.org/R..._libsystemd.so.0()(64bit) 被 erlang-25.3.2.8-1.el7.x86_64 需要

基于深度学习的恶意软件检测-程序员宅基地

文章浏览阅读1.2k次。恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网络系统瘫痪。

自定义控件之 SubmitBotton (提交按钮)_自定义 submit-程序员宅基地

文章浏览阅读1k次。在 Android 中我觉得除了实现很多功能性很强的需求之外,最吸引我的就是各种炫酷的自定义控件,但是自定义控件这个东西没有办法用一种固定的模式来讲解,因为自定义控件都是根据需求来定制的。同时这也说明只要程序猿牛逼,就没有实现不了的功能。从事实际开发一年多,其实感觉自己的技术成长得很慢,很多东西自己还是处于模仿的阶段,很希望自己能够创新出一种库,自己能够让技术流行起来。之前有看到一个效果:_自定义 submit

安卓城市选择,列表显示,拼音排序,滑动选择。_铜川安卓开发-程序员宅基地

文章浏览阅读3.3k次。最近开发项目有一个需要,选择城市,有三级滚筒式的,有些丑,所以仿造流行的联系人列表选择做了一个。先上图看下效果:http://img.blog.csdn.net/20170112141746730?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbjEwMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCM_铜川安卓开发

【基础知识】——字符串_、↑。i、!冫′`p串怵`i彳-程序员宅基地

文章浏览阅读139次。【基础知识】——字符串SAM一些变量lenendpos广义SAM实现两种写法离线在线一些变量endposSAM把一个字符串丢进去跑,能不重不漏的得到每一个子串一些变量len记录当前节点的最长子串的长度,sam[i].len−sam[sam[i].fa].lensam[i].len-sam[sam[i].fa].lensam[i].len−sam[sam[i].fa].len,得到的就是这个节点的子串数量,把cnt个节点的结果都加起来,得到的就是该子串中本质不同的串的数量了endpos当这个节点_、↑。i、!冫′`p串怵`i彳

随便推点

it有啥好咨询的_从埃森哲IT规划咨询方法论里究竟可以学习什么-程序员宅基地

文章浏览阅读964次。在我头条前面的文章里面分享过一些IT咨询规划的材料,也分享过一些IT系统解决方案,技术方案类的文章。对于IT咨询规划来说本身也是一个渐近发展的过程,从最早的信息化规划,再到企业架构规划,再到融合云计算和SOA思想的企业私有云规划,发展到最近又融入了更多的云原生,中台,微服务的思想。如果要学习IT咨询规划和解决方案制作能力,实际上需要从业务和技术两个方面入手,同时要真正打通业务和技术的衔接问题。业务..._accenture as-is to-be

Kafka系列之:kafka集群管理工具Know Streaming安装详细步骤_docker安装knowstreaming-程序员宅基地

文章浏览阅读1.2k次。Kafka系列之:kafka集群管理工具Know Streaming安装详细步骤_docker安装knowstreaming

[深度学习] 深度可分离卷积_深度可分离卷积介绍以及它们的优缺点-程序员宅基地

文章浏览阅读1.3w次,点赞11次,收藏91次。一 深度可分离卷积深度可分离卷积之所以如此命名,是因为它不仅处理空间维度,还处理深度维度-通道的数量。通常输入图像可以有3个通道:RGB。经过几次卷积后,一个图像可能有多个通道。你可以把每个频道想象成那个图像的一个特殊解释;例如,“红色”通道解释每个像素的“红色”,“蓝色”通道解释每个像素的“蓝色”,“绿色”通道解释每个像素的“绿色”。一个有64个频道的图像有64种不同的解释。深度可分离卷..._深度可分离卷积介绍以及它们的优缺点

VTK-Python环境在VScode中的配置(以vtkpython-7.1.1-Windows-64bit为例)_vtkpython-7.1.1-linux-64bit-程序员宅基地

文章浏览阅读1.3k次。首先,需先安装好python2.7.01、在vtk官网下载vtkpython-windows-64bit并安装到本地文件夹 (看清对应的python版本是2/3,vtkpython-7.1.1对应python2)2、将系统变量Path中配置:python2.7.0路径D:\software\python2.7.0vtkpython路径:D:\software\vtkpython\VTK..._vtkpython-7.1.1-linux-64bit

【配置】Navicat连接sqlServer_navicat sqlserver-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏9次。找到 sqlncli.msi 点Next开始下载。选择 高级-Native Client驱动程序。1.如果没有ODBC驱动则先下载驱动。Navicat 配置新建连接。_navicat sqlserver

C# winform 垂直进度条控件_c#中progressbar如何垂直显示-程序员宅基地

文章浏览阅读645次。public class VerticalProgressBar : ProgressBar { protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.Style |= 0x04; return c.._c#中progressbar如何垂直显示

推荐文章

热门文章

相关标签