zoukankan      html  css  js  c++  java
  • BeetleX和Asp.net Core之webapi基础性能对比

    本文主要针对BeetleX和Asp.net Core在基础WebApi功能性能对比

    测试环境描述

    硬件配置:E1230V2 16G内存 10Gb带宽
    
    操作系统:Windows server 2008 R2 + .Net Core 2.15
    
    测试工具:bombardier.exe
    

    测试功能代码

    为了确保测试的基础功能一致性,因此所有测试的url和请求输出内容都是一致。以下是针对BeetleX和Asp.net Core实现的WebaApi基础功能代码:

    asp.net core mvc webapi

        public class HomeController : Controller
        {
    
            public class JsonMessage
            {
                public string message { get; set; }
            }
    
            public string plaintext()
            {
                return "Hello, World!";
            }
    
            public object json()
            {
                return new JsonMessage { message = "Hello, World!" };
            }
    
            public Employee Employee(int id)
            {
                Employee result = DataHelper.Defalut.Employees.Find(e => e.EmployeeID == id);
                if (result == null)
                    result = new Employee();
                return result;
            }
    
            public object Orders(int id, string customerid, int index, int size)
            {
                Func<Order, bool> exp = o => (id == 0 || o.EmployeeID == id)
                 && (string.IsNullOrEmpty(customerid) || o.CustomerID == customerid);
                int count = DataHelper.Defalut.Orders.Count(exp);
                if (size == 0)
                    size = 10;
                int pages = count / size;
                if (count % size > 0)
                    pages++;
                var items = DataHelper.Defalut.Orders.Where(exp).Skip(index * size).Take(size);
                return items;
            }
        }

    beetlex webapi

        [Controller(BaseUrl = "Home")]
        public class Controller
        {
            public class JsonMessage
            {
                public string message { get; set; }
            }
    
            public object plaintext()
            {
                return new TextResult("Hello, World!");
            }
    
            public object json()
            {
                return new JsonResult(new JsonMessage { message = "Hello, World!" });
            }
            [Get(Route = "{id}")]
            public object Employee(int id)
            {
                Employee result = DataHelper.Defalut.Employees.Find(e => e.EmployeeID == id);
                if (result == null)
                    result = new Employee();
                return new JsonResult(result);
            }
            [Get(Route = "{id}")]
            public object Orders(int id, string customerid, int index, int size)
            {
                Func<Order, bool> exp = o => (id == 0 || o.EmployeeID == id)
                 && (string.IsNullOrEmpty(customerid) || o.CustomerID == customerid);
                int count = DataHelper.Defalut.Orders.Count(exp);
                if (size == 0)
                    size = 10;
                int pages = count / size;
                if (count % size > 0)
                    pages++;
                var items = DataHelper.Defalut.Orders.Where(exp).Skip(index * size).Take(size);
                return new JsonResult(items);
    
            }
        }

    测试方式

    通过bombardier.exe工具对两个服务开启100个连接并进行10000000次请求响应测试。测试的url如下:

    /home/plaintext //返回一个简单的Hello, World!文本
    /home/json          //返回一个简单的Hello, World! json对象
    /home/employee/3   //返回一个记员的json对象
    /home/orders/3?index=0&size=5 //返回对应雇员订单列表的json对象
    

    测试结果

    从测试结果来看在最基本的内容输出时,主要涉及是网络处理这一块,在这方面Beetlex webapi有着绝对性能的优势,可以说比Asp.net Core webapi高出两倍之多。但随着加入一些json处理功能逻辑处理占用比率高后性能的差异就不是非常突出(也说明一点Newtonsoft.Json在处理json的时候没有.net coret自己的处理高效),不过即使在后面返回订单列表的时候还具备着一倍的性能优势在。为了更进一步测试BeetleX的处理能,已经把测试代码提交上TechEmpower/FrameworkBenchmarks,在一下轮测试应该能看到BeetleX的身影出现。

    测试结果详细数据

    asp core webapi

    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:8080/home/plaintext"
    Bombarding http://192.168.2.18:8080/home/plaintext with 10000000 request(s) usin
    g 100 connection(s)
     10000000 / 10000000 [==========================================] 100.00% 2m14s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec     74691.94    3817.11  114988.50
      Latency        1.33ms   488.74us   385.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    17.38MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:8080/home/json"
    Bombarding http://192.168.2.18:8080/home/json with 10000000 request(s) using 100
     connection(s)
     10000000 / 10000000 [==========================================] 100.00% 2m24s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec     69093.60    3770.80   83161.12
      Latency        1.44ms   549.52us   385.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    17.13MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:8080/home/employee/3"
    
    Bombarding http://192.168.2.18:8080/home/employee/3 with 10000000 request(s) usi
    ng 100 connection(s)
     10000000 / 10000000 [==========================================] 100.00% 3m15s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec     51224.14    2667.55   57796.82
      Latency        1.95ms   637.04us   415.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    29.16MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:8080/home/orders/3?in
    dex=0&size=5"
    Bombarding http://192.168.2.18:8080/home/orders/3?index=0&size=5 with 10000000 r
    equest(s) using 100 connection(s)
     10000000 / 10000000 [===========================================] 100.00% 5m7s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec     32481.62    1568.13   36897.79
      Latency        3.07ms     2.13ms   600.03ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    57.96MB/s

    beetlex webapi

    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:9090/home/plaintext"
    Bombarding http://192.168.2.18:9090/home/plaintext with 10000000 request(s) usin
    g 100 connection(s)
     10000000 / 10000000 [============================================] 100.00% 41s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec    239341.58   39420.70  261535.62
      Latency      413.11us     1.02ms   396.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    41.56MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:9090/home/json"
    Bombarding http://192.168.2.18:9090/home/json with 10000000 request(s) using 100
     connection(s)
     10000000 / 10000000 [============================================] 100.00% 54s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec    184345.82   24707.02  208438.54
      Latency      537.74us     1.07ms   395.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    34.64MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:9090/home/employee/3"
    
    Bombarding http://192.168.2.18:9090/home/employee/3 with 10000000 request(s) usi
    ng 100 connection(s)
     10000000 / 10000000 [==========================================] 100.00% 1m12s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec    138350.49   15090.09  162791.05
      Latency      717.80us     1.14ms   397.02ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    70.33MB/s
    D:>bombardier.exe -c 100 -n 10000000 "http://192.168.2.18:9090/home/orders/3?in
    dex=0&size=5"
    Bombarding http://192.168.2.18:9090/home/orders/3?index=0&size=5 with 10000000 r
    equest(s) using 100 connection(s)
     10000000 / 10000000 [==========================================] 100.00% 2m26s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec     68505.91    3209.14   72597.10
      Latency        1.46ms     2.14ms   599.03ms
      HTTP codes:
        1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:   118.06MB/s

    完整测试代码 

    https://github.com/IKende/FastHttpApi/tree/master/PerformanceTest/Beetlex_VS_AspCore_webapi

  • 相关阅读:
    Oracle数据库部分迁至闪存存储方案
    RAC环境下误操作将数据文件添加到本地存储
    Oracle的窗口和自动任务
    ####### Scripts Summary #######
    plsql 操纵表数据的2种方式
    css 如何使图片与文字在div中居中展示?
    eclipse svn新增文件不显示在文件列表,只有修改文件可以提交!
    js 正则表达式校验必须包含字母、数字、特殊字符
    css 禁止录入中文
    POJ 1740:A New Stone Game
  • 原文地址:https://www.cnblogs.com/smark/p/10502627.html
Copyright © 2011-2022 走看看