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


一、说明

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

二、待测试产品、环境

2.1 Socket产品

有其他建议请联系我

  • HPSocket.Net
  • SuperSocket
  • TouchSocket
项目SuperSocketHPSocket.NetTouchSocket
GiteeGiteeGiteeGitee
GithubGithubGithubGithub
Gitee DemoDemoDemoDemo
Github 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<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也是少量释放,都应该归功于内存池。

四、综合功能及特性

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

五、最后结语

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

.NET C#是一种面向对象的编程语言,它是微软公司推出的一种多平台开发框架。基于.NET C#的开发平台可以支持Windows、Linux和macOS系统,能够开发桌面应用程序、web应用程序和移动应用程序等。 .NET C#具有很多优点。首先,它具有强大的跨平台能力,可以在不同的操作系统上运行,大大提升了开发的灵活性和效率。其次,C#语言本身具有简单易学的特点,语法规则清晰,对于初学者来说比较容易上手。同时,它也拥有许多强大的库和工具,可以大大减少开发的复杂性。此外,C#还支持其他语言相关的功能,如异步编程、LINQ等,使开发更加简洁高效。 基于.NET C#的开发框架也是非常强大的。它提供了丰富的类库和API,可以快速开发出高质量、可扩展的应用程序。对于数据库操作、网络通信、图形界面开发等常用功能,都有相应的库和工具来支持。同时,它还提供了一套灵活的开发模型和丰富的设计模式,可以满足不同项目的需求。 .NET C#还有一个优点是它具有良好的安全性和稳定性。在开发过程中,C#会自动进行内存管理,减少内存泄漏和垃圾回收问题。而且,C#还提供了一些强大的安全特性,如类型安全、代码访问安全等,可以保证应用程序的安全性。 总之,基于.NET C#的开发平台是一种强大、灵活和高效的工具,可以帮助开发人员快速开发出高质量的应用程序。无论是开发桌面应用程序还是web应用程序,都可以选择.NET C#作为开发语言,来实现各种需求。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若汝棋茗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值