栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
    • 一、说明
    • 二、待测试产品、环境
        • 2.1 Socket产品
        • 2.2 测试物理机
    • 三、测试
        • 3.1 服务器测试项目配置
        • 3.2 TCP服务器测试参数配置
        • 3.3 测试一
        • 3.4 测试二
        • 3.5 测试三
    • 四、综合功能及特性
    • 五、最后结语


一、说明

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

二、待测试产品、环境 2.1 Socket产品

有其他建议请联系我

  • HPSocket.Net
  • SuperSocket
  • RRQMSocket
项目SuperSocketHPSocket.NetRRQMSocket
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();

【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】

总结:千次连接测试中,HPSocket性能突出,SuperSocket与RRQMSocket不相上下,可能还是因为HPSocket是基于C++缘故。但是总体差距不大,而且都在可接受范围内。


在内存方面,SuperSocket采用预分配策略,在刚启动时,就分配内存,但是在连接时,内存依然会上升,最终达98Mb。HPSocket在连接以后,内存达到25Mb,堪称内存模范。RRQMSocket在完成连接以后,内存上升至39Mb。


在CPU使用率方面,SuperSocket使用率最高,其次是RRQMSocket,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】

【RRQMSocket】

总结:万次连接,千次数据交互测试中,三者的差异也比较小,但无疑RRQMSocket夺得桂冠。


在内存方面,SuperSocket最终达243Mb,且GC极度频繁。HPSocket内存达到75Mb,因为接收逻辑使用C++,所以无GC问题。RRQMSocket内存上升至92Mb,GC少量释放,这是因为有内存池的缘故。


在接收效率方面,RRQMSocket夺得桂冠,其次是HPSocket。但是因为差距不大,所以也不排除计算机性能因素。

3.5 测试三

建立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也是少量释放,都应该归功于内存池。

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

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

本次测试源码:RRQMPerformanceTest

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号