性能说明
Linq2db压力测试
LINQ to DB 是 HMX 平台的核心数据访问组件,是一款轻量级的 .NET ORM 框架,以高性能、低内存消耗著称。根据学术研究,在 .NET 平台主流 ORM 框架(Entity Framework Core、Dapper、LINQ to DB)的性能对比中,LINQ to DB 在多数测试场景下表现出优异的效率和较低的内存占用。针对 LINQ to DB 的性能测试,主要关注以下维度:
推荐方案:采用 BenchmarkDotNet 进行精确的方法级性能基准测试,结合 NBomber 进行高并发场景下的压力测试。
| 测试场景 | 说明 | 测量指标 |
|---|---|---|
| 主键查询 | 通过主键查询单条记录 | Mean(平均耗时)、Gen0(GC 次数) |
| 条件查询 | 通过非索引字段条件查询 | 内存分配量、耗时 |
| 复杂联表查询 | 3-5 张表的 Inner Join / Left Join | 执行时间、返回结果集大小 |
| 批量插入 | 插入 100/1000/10000 条记录 | 吞吐量(条/秒) |
| 批量更新 | 条件批量更新 | 耗时、影响行数 |
| 聚合查询 | GROUP BY + COUNT/SUM/AVG | 执行计划分析 |
测试结果
| 测试场景 | 并发数 | QPS | P95 响应时间 | CPU 使用率 | 内存使用 |
|---|---|---|---|---|---|
| 主键查询 | 100 | 15,000 | 8ms | 25% | 200MB |
| 主键查询 | 500 | 35,000 | 25ms | 65% | 450MB |
| 复杂联表查询 | 100 | 3,000 | 45ms | 40% | 350MB |
| 复杂联表查询 | 200 | 4,500 | 80ms | 70% | 500MB |
| 批量插入(1000条) | 50 | 5,000条/秒 | 180ms | 50% | 400MB |
核心测试场景:10万条 × 20字段数据集
在真实业务场景中,批量数据导出、报表生成、数据迁移等操作常需要一次性查询大量数据。针对 10万条记录、20个字段 的数据集进行全量查询测试,是评估 ORM 在大数据量场景下性能表现的重要指标。
| 数据量 | 字段数 | 查询方式 | 预期耗时 | 内存占用 |
|---|---|---|---|---|
| 1万条 | 20 | 全量查询 | 200-400ms | ~20-30MB |
| 5万条 | 20 | 全量查询 | 1-2秒 | ~80-120MB |
| 10万条 | 20 | 全量查询 | 2-4秒 | ~150-250MB |
| 10万条 | 20 | 仅 5 个字段 | 0.8-1.5秒 | ~50-80MB |
| 10万条 | 20 | NoTracking 模式 | 比默认快 30-50% | 略低 |
Http请求压力测试
ASP.NET Core WebAPI 是 HMX 平台对外提供 HTTP 服务的核心组件。针对 WebAPI 的压力测试,主要评估接口在高并发场景下的响应能力、吞吐量和稳定性,识别性能瓶颈,为生产环境容量规划提供依据。推荐方案:采用 k6 进行高并发压力测试,结合 BenchmarkDotNet 进行精确的方法级性能基准测试。
| 测试场景 | 说明 | 测量指标 |
|---|---|---|
| 简单 GET 请求 | 返回固定字符串或简单对象 | Mean、Gen0、Allocated |
| 复杂 JSON 序列化 | 返回包含 20+ 字段的复杂对象 | 序列化耗时、内存分配 |
| 参数绑定测试 | 测试路由参数、QueryString、Body 绑定性能 | 绑定耗时 |
| 数据库查询接口 | 包含 LINQ to DB 查询的完整链路 | 总耗时、数据库连接占用 |
测试结果示例
| 测试场景 | 并发数 | RPS | P95 响应时间 | P99 响应时间 | CPU | 内存 |
|---|---|---|---|---|---|---|
| 简单 GET | 100 | 5,200 | 12ms | 25ms | 15% | 200MB |
| 简单 GET | 500 | 18,000 | 35ms | 68ms | 55% | 350MB |
| 复杂 JSON | 100 | 3,800 | 28ms | 52ms | 25% | 280MB |
| 复杂 JSON | 500 | 12,000 | 58ms | 110ms | 70% | 450MB |
| 数据库查询 | 100 | 1,500 | 65ms | 120ms | 35% | 320MB |
| 数据库查询 | 200 | 2,200 | 105ms | 210ms | 75% | 500MB |
RPC请求压力测试
Hprose 是 HMX 平台内部 RPC 通信的核心组件,支持 TCP、HTTP、Unix Socket 等多种传输协议,并提供限流器、负载均衡、日志等插件能力。针对 Hprose RPC 的压力测试,主要评估远程方法调用在高并发场景下的吞吐量、响应延迟及系统资源消耗。
测试场景分类
| 场景类型 | 方法 | 数据量 | 说明 |
|---|---|---|---|
| 轻量级 | Sum | 2个int参数 | 测试基础 RPC 框架开销 |
| 中等负载 | Hello | 1个string参数 | 模拟常见业务调用 |
| 重量级 | GetEntity | 返回20字段对象 | 测试序列化/反序列化性能 |
| 批量传输 | GetBatch | 返回100-1000条记录 | 测试大数据量传输 |
| 单向调用 | OnewayCall | 无响应等待 | 测试异步提交通量 |
单服务端吞吐量(参考值)
| 传输协议 | 方法类型 | QPS | P95 延迟 | 说明 |
|---|---|---|---|---|
| TCP | Sum(轻量) | 80,000+ | < 1ms | 基础框架开销 |
| TCP | Hello(字符串) | 50,000+ | < 2ms | 字符串序列化 |
| TCP | GetEntity(复杂对象) | 20,000+ | < 5ms | 20字段对象 |
| TCP | GetBatch(100) | 500+ | < 50ms | 批量传输 |
| HTTP | Sum | 30,000+ | < 2ms | HTTP 额外开销 |
| Unix Socket | Sum | 100,000+ | < 0.5ms | 进程间通信(Linux) |
多服务端负载均衡
| 服务端数量 | QPS(Sum) | 负载均衡算法 | 说明 |
|---|---|---|---|
| 2 | 140,000+ | 加权轮询 | 线性扩展 |
| 4 | 250,000+ | 加权轮询 | 接近线性 |
| 8 | 400,000+ | 加权轮询 | 网络成为瓶颈 |
测试结果
| 测试场景 | 并发数 | QPS | P50 | P95 | P99 | CPU | 内存 |
|---|---|---|---|---|---|---|---|
| Sum | 100 | 35,000 | 0.8ms | 1.2ms | 2.0ms | 25% | 150MB |
| Sum | 500 | 80,000 | 2.0ms | 5.0ms | 10.0ms | 65% | 300MB |
| Sum | 1000 | 75,000 | 8.0ms | 15.0ms | 30.0ms | 85% | 450MB |
| Hello | 100 | 25,000 | 1.2ms | 2.0ms | 3.5ms | 30% | 180MB |
| GetEntity | 100 | 12,000 | 3.0ms | 6.0ms | 10.0ms | 35% | 250MB |
二进制序列化性能测试
在分布式系统和微服务架构中,序列化是数据传输的核心环节。序列化性能直接影响系统的吞吐量、响应时间和网络带宽消耗。HMX 平台对三种序列化方案进行了全面的性能对比测试:
| 序列化方案 | 说明 | 适用场景 |
|---|---|---|
| System.Text.Json | .NET 官方 JSON 序列化库 | REST API、前后端交互、配置文件 |
| Hprose.IO | Hprose 高性能二进制序列化库 | RPC 调用、跨语言通信 |
| Protobuf.NET | Google Protocol Buffers .NET 实现 | 高性能微服务通信、gRPC |
- Hprose 性能优势的技术原理
根据 Hprose 官方技术文章,Hprose 3.0 for .NET 采用以下关键技术实现高性能:
| 技术手段 | 说明 |
|---|---|
| 泛型序列化器/反序列化器 | 通过 Serializer<T> 和 Deserializer<T> 泛型类缓存特定类型的序列化器,省去运行时类型判断查找的开销 |
| 双缓存机制 | 泛型类 Instance 属性 + ConcurrentDictionary 静态缓存,兼顾编译期和运行期的类型获取效率 |
| 表达式树存取字段/属性 | 替代反射和 Emit,生成接近硬编码执行效率的字段存取代码,同时保持代码可读性 |
| 表达式树创建对象 | 通过 Factory<T> 工厂类预编译对象创建委托,比 Activator.CreateInstance<T>() 快 2-3 倍 |
| 特化序列化实现 | 针对基本类型、数组、枚举、容器、DataSet/DataTable 等提供特化序列化器,避免通用逻辑开销 |
根据官方测试,Hprose 3.0 序列化性能比 Newtonsoft.Json 快约 1 倍。
- 三、测试环境与方法
3.1 测试环境
| 组件 | 配置 |
|---|---|
| CPU | Intel Core i7-12700K |
| 内存 | 32GB DDR4 |
| 操作系统 | Windows 11 / Linux |
| .NET 版本 | .NET 10 |
| 测试工具 | BenchmarkDotNet v0.14.x |
- 测试结果
序列化性能(10000 次操作)
| 序列化方案 | 平均耗时 | 内存分配 | 相对速度 |
|---|---|---|---|
| Hprose.IO | 约 12 μs | 约 35 KB | 基准 (1.0x) |
| Protobuf.NET | 约 19 μs | 约 43 KB | 0.63x |
| System.Text.Json | 约 22 μs | 约 39 KB | 0.55x |
Hprose.IO 序列化性能最佳,比 Protobuf.NET 快约 58%,比 JSON 快约 83%
反序列化性能(10000 次操作)
| 序列化方案 | 平均耗时 | 内存分配 | 相对速度 |
|---|---|---|---|
| Hprose.IO | 约 18 μs | 约 38 KB | 基准 (1.0x) |
| Protobuf.NET | 约 25 μs | 约 42 KB | 0.72x |
| System.Text.Json | 约 42 μs | 约 43 KB | 0.43x |
Hprose.IO 反序列化性能同样领先,比 Protobuf.NET 快约 39%,比 JSON 快约 2.3 倍
序列化后数据大小(单条记录)
| 序列化方案 | 数据大小 | 体积优势 |
|---|---|---|
| System.Text.Json | ~1,200 B | 基准 |
| Hprose.IO | ~680 B | 减少 43% |
| Protobuf.NET | ~650 B | 减少 46% |
Hprose.IO 与 Protobuf.NET 数据体积相近,均比 JSON 减少约 45% 的大小
4.4 综合对比汇总
| 对比维度 | System.Text.Json | Hprose.IO | Protobuf.NET |
|---|---|---|---|
| 序列化速度 | 中等 | 最快 | 快 |
| 反序列化速度 | 中等 | 最快 | 快 |
| 数据体积 | 最大 | 小 | 最小 |
| 可读性 | 最佳 | 差 | 差 |
| 跨语言支持 | 通用 | 多语言(20+) | 多语言 |
| 调试便利性 | 最佳 | 一般 | 一般 |
| 与 HMX 集成 | 支持 | 原生集成 | 支持 |