|
|
@@ -0,0 +1,458 @@
|
|
|
+# Apq.Cfg 性能测试对比分析
|
|
|
+
|
|
|
+**对比版本**:
|
|
|
+- 第一次测试:2025-12-29_180801(.NET 6.0/8.0/9.0)
|
|
|
+- 第二次测试:2026-01-01_0211(.NET 8.0/10.0)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 测试环境对比
|
|
|
+
|
|
|
+| 项目 | 第一次 (180801) | 第二次 (0211) | 变化 |
|
|
|
+|------|-----------------|---------------|------|
|
|
|
+| **操作系统** | Windows 11 (10.0.26200.7462/25H2) | Windows 11 (10.0.26200.7462/25H2) | 相同 |
|
|
|
+| **处理器** | AMD Ryzen 9 9950X3D 4.30GHz | AMD Ryzen 9 9950X3D 4.30GHz | 相同 |
|
|
|
+| **BenchmarkDotNet** | v0.15.8 | v0.15.8 | 相同 |
|
|
|
+| **SDK版本** | .NET SDK 9.0.308 | .NET SDK 10.0.101 | **升级** |
|
|
|
+| **测试运行时** | .NET 6.0.36, 8.0.22, 9.0.11 | .NET 8.0.22, 10.0.1 | **变更** |
|
|
|
+
|
|
|
+**环境变化说明**:
|
|
|
+- SDK 从 9.0.308 升级到 10.0.101
|
|
|
+- 移除了 .NET 6.0 支持
|
|
|
+- 新增了 .NET 10.0 支持
|
|
|
+- 移除了 .NET 9.0(改为 .NET 10.0)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、测试覆盖范围
|
|
|
+
|
|
|
+两次测试均覆盖 18 个测试类别,无变化:
|
|
|
+
|
|
|
+1. BatchOperationBenchmarks - 批量操作性能
|
|
|
+2. CacheBenchmarks - 缓存效果性能
|
|
|
+3. ConcurrencyBenchmarks - 并发性能
|
|
|
+4. CryptoBenchmarks - 加密解密性能
|
|
|
+5. DependencyInjectionBenchmarks - 依赖注入性能
|
|
|
+6. EncodingBenchmarks - 编码处理性能
|
|
|
+7. GetSectionBenchmarks - 配置节获取性能
|
|
|
+8. KeyPathBenchmarks - 键路径解析性能
|
|
|
+9. LargeFileBenchmarks - 大文件处理性能
|
|
|
+10. MicrosoftConfigBenchmarks - 与微软配置库对比
|
|
|
+11. MultiSourceBenchmarks - 多源配置性能
|
|
|
+12. ObjectBinderBenchmarks - 对象绑定性能
|
|
|
+13. ReadWriteBenchmarks - 读写性能
|
|
|
+14. RemoveBenchmarks - 删除操作性能
|
|
|
+15. SaveBenchmarks - 保存操作性能
|
|
|
+16. SourceGeneratorBenchmarks - 源生成器性能
|
|
|
+17. TypeConversionBenchmarks - 类型转换性能
|
|
|
+18. ZookeeperBenchmarks - Zookeeper集成性能
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、核心性能指标对比(.NET 8.0)
|
|
|
+
|
|
|
+以下对比两次测试中 .NET 8.0 的性能数据。
|
|
|
+
|
|
|
+### 1. 批量操作测试 (BatchOperationBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| GetMany_10Keys | 325.0 ns | 348.2 ns | +7% | 略有波动 |
|
|
|
+| Get_Loop_10Keys | 155.8 ns | 176.5 ns | +13% | 略有波动 |
|
|
|
+| GetMany_50Keys | 1,537.2 ns | 1,659.8 ns | +8% | 略有波动 |
|
|
|
+| Get_Loop_50Keys | 864.0 ns | 914.3 ns | +6% | 稳定 |
|
|
|
+| GetMany_100Keys | 3,685.1 ns | 3,339.0 ns | **-9%** | 性能提升 |
|
|
|
+| Get_Loop_100Keys | 1,713.3 ns | 1,949.3 ns | +14% | 略有波动 |
|
|
|
+| SetMany_10Keys | 4,414.7 ns | 4,613.1 ns | +4% | 稳定 |
|
|
|
+| Set_Loop_10Keys | 3,012.5 ns | 3,363.3 ns | +12% | 略有波动 |
|
|
|
+| SetMany_100Keys | 8,648.4 ns | 8,537.8 ns | **-1%** | 稳定 |
|
|
|
+| Set_Loop_100Keys | 6,176.7 ns | 6,423.0 ns | +4% | 稳定 |
|
|
|
+
|
|
|
+**结论**:批量操作性能整体稳定,大批量读取(100键)略有提升。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2. 缓存效果测试 (CacheBenchmarks)
|
|
|
+
|
|
|
+| 场景 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| HotPath_SameKey_1000 | 18,196 ns | 13,359 ns | **-27%** | 显著提升 |
|
|
|
+| HotPath_SameKey_10000 | 139,711 ns | 142,280 ns | +2% | 稳定 |
|
|
|
+| 单次缓存命中读取 | 20.10 ns | 15.70 ns | **-22%** | 显著提升 |
|
|
|
+| 缓存未命中读取 | 2,033 ns | 1,565 ns | **-23%** | 显著提升 |
|
|
|
+| 冷路径随机访问 | 77,993 ns | 90,061 ns | +15% | 略有波动 |
|
|
|
+
|
|
|
+**重要发现**:
|
|
|
+- 热路径读取性能提升 27%
|
|
|
+- 单次缓存命中读取提升 22%
|
|
|
+- 缓存未命中读取提升 23%
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 3. 并发测试 (ConcurrencyBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 并发读取 (4线程) | 4.654 us | 6.630 us | +42% | 性能下降 |
|
|
|
+| 并发写入 (4线程) | 17.046 us | 20.742 us | +22% | 性能下降 |
|
|
|
+| 读写混合 | 3.088 us | 4.037 us | +31% | 性能下降 |
|
|
|
+| Exists检查 | 3.304 us | 4.377 us | +32% | 性能下降 |
|
|
|
+| 高并发读取 (16线程) | 22.266 us | 21.069 us | **-5%** | 略有提升 |
|
|
|
+| 高并发写入 (16线程) | 40.236 us | 30.698 us | **-24%** | 显著提升 |
|
|
|
+
|
|
|
+**结论**:4线程并发性能有所下降,但16线程高并发写入性能提升24%。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 4. 依赖注入测试 (DependencyInjectionBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 服务注册 | ~138,000 ns | ~139,000 ns | +1% | 稳定 |
|
|
|
+| 服务解析 | 7.89 ns | 7.89 ns | 0% | 稳定 |
|
|
|
+| 配置绑定 | 720 ns | 720 ns | 0% | 稳定 |
|
|
|
+| 选项模式 | 864 ns | 864 ns | 0% | 稳定 |
|
|
|
+| IConfiguration获取 | 7.05 ns | 7.05 ns | 0% | 稳定 |
|
|
|
+
|
|
|
+**结论**:DI 相关操作性能保持稳定。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 5. 编码处理测试 (EncodingBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| UTF-8 读取 | 34.00 us | 35.46 us | +4% | 稳定 |
|
|
|
+| UTF-8 BOM 读取 | 36.15 us | 34.78 us | **-4%** | 稳定 |
|
|
|
+| GB2312 读取 | 139.15 us | 139.61 us | 0% | 稳定 |
|
|
|
+| 大文件 UTF-8 | 37,531 us | 35,376 us | **-6%** | 略有提升 |
|
|
|
+| 编码检测 | 1.31 us | 1.45 us | +11% | 略有波动 |
|
|
|
+
|
|
|
+**结论**:编码处理性能整体稳定。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 6. 配置节获取测试 (GetSectionBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 根级别获取 | 29.60 ns | 21.33 ns | **-28%** | 显著提升 |
|
|
|
+| 1层嵌套 | 46.52 ns | 30.84 ns | **-34%** | 显著提升 |
|
|
|
+| 深层嵌套(5层) | 1,503 ns | 1,021 ns | **-32%** | 显著提升 |
|
|
|
+| 直接键访问 | 5.16 ns | 3.69 ns | **-28%** | 显著提升 |
|
|
|
+| 子节点枚举 | 650 ns | 478 ns | **-26%** | 显著提升 |
|
|
|
+
|
|
|
+**重要发现**:配置节获取性能全面提升 26-34%!
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 7. 键路径解析测试 (KeyPathBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 简单路径解析 | 18.84 ns | 13.68 ns | **-27%** | 显著提升 |
|
|
|
+| 复杂路径解析 | 36.28 ns | 26.16 ns | **-28%** | 显著提升 |
|
|
|
+| 路径规范化 | 67,863 ns | 51,499 ns | **-24%** | 显著提升 |
|
|
|
+| 路径合并 | 84.81 ns | 56.70 ns | **-33%** | 显著提升 |
|
|
|
+| 路径分割 | 6,012 ns | 4,151 ns | **-31%** | 显著提升 |
|
|
|
+
|
|
|
+**重要发现**:键路径解析性能全面提升 24-33%!
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 8. 大文件处理测试 (LargeFileBenchmarks)
|
|
|
+
|
|
|
+| 格式 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| JSON 加载 | 313.6 us | 276.5 us | **-12%** | 性能提升 |
|
|
|
+| YAML 加载 | 219.4 us | 218.5 us | 0% | 稳定 |
|
|
|
+| XML 加载 | 504.6 us | 661.1 us | +31% | 性能下降 |
|
|
|
+| TOML 加载 | 991 us | 1,002 us | +1% | 稳定 |
|
|
|
+| INI 加载 | 971 us | 908 us | **-6%** | 略有提升 |
|
|
|
+
|
|
|
+**结论**:JSON 加载性能提升 12%,XML 加载性能下降。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 9. 微软配置库对比 (MicrosoftConfigBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| Apq.Cfg 读取 | ~70 ns | 72.43 ns | +3% | 稳定 |
|
|
|
+| MS Config 读取 | ~90 ns | 99.41 ns | +10% | 略有波动 |
|
|
|
+| Apq.Cfg 写入 | ~900 ns | 1,109 ns | +23% | 性能下降 |
|
|
|
+| 节获取 | ~18 ns | 17.93 ns | 0% | 稳定 |
|
|
|
+| 空值检查 | ~0.2 ns | 0.24 ns | +20% | 略有波动 |
|
|
|
+
|
|
|
+**结论**:Apq.Cfg 仍然比 MS Config 读取快约 27%。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 10. 多源配置测试 (MultiSourceBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 单源读取 | 59.87 ns | 44.18 ns | **-26%** | 显著提升 |
|
|
|
+| 双源合并读取 | 74.25 ns | 50.25 ns | **-32%** | 显著提升 |
|
|
|
+| 三源合并读取 | 50.72 ns | 39.82 ns | **-21%** | 显著提升 |
|
|
|
+| 源优先级解析 | 12,818 ns | 9,297 ns | **-27%** | 显著提升 |
|
|
|
+| 动态源切换 | 5,669 ns | 3,897 ns | **-31%** | 显著提升 |
|
|
|
+
|
|
|
+**重要发现**:多源配置性能全面提升 21-32%!
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 11. 对象绑定测试 (ObjectBinderBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 简单对象绑定 | 470.4 ns | 335.1 ns | **-29%** | 显著提升 |
|
|
|
+| 复杂对象绑定 | 2,329 ns | 1,810 ns | **-22%** | 显著提升 |
|
|
|
+| 嵌套对象绑定 | 3,253 ns | 2,606 ns | **-20%** | 显著提升 |
|
|
|
+| 集合绑定 | 5,964 ns | 4,849 ns | **-19%** | 显著提升 |
|
|
|
+| 大对象绑定 | 593,572 ns | 455,682 ns | **-23%** | 显著提升 |
|
|
|
+
|
|
|
+**重要发现**:对象绑定性能全面提升 19-29%!
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 12. 读写基准测试 (ReadWriteBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 字符串读取 | 24.78 ns | 18.04 ns | **-27%** | 显著提升 |
|
|
|
+| 字符串写入 | 34.74 ns | 26.54 ns | **-24%** | 显著提升 |
|
|
|
+| 整数读取 | 23.34 ns | 18.67 ns | **-20%** | 显著提升 |
|
|
|
+| 布尔读取 | 16.93 ns | 19.15 ns | +13% | 略有波动 |
|
|
|
+| 空值读取 | 23.79 ns | 22.00 ns | **-8%** | 略有提升 |
|
|
|
+
|
|
|
+**重要发现**:核心读写性能提升 20-27%!
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 13. 删除操作测试 (RemoveBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 单键删除 | 8.32 us | 6.20 us | **-25%** | 显著提升 |
|
|
|
+| 批量删除(10) | 1.89 us | 1.66 us | **-12%** | 性能提升 |
|
|
|
+| 节删除 | 949 us | 1,300 us | +37% | 性能下降 |
|
|
|
+| 递归删除 | 902 us | 2,193 us | +143% | 性能下降 |
|
|
|
+
|
|
|
+**结论**:单键和批量删除性能提升,节删除和递归删除性能下降。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 14. 保存操作测试 (SaveBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| JSON 保存 | 3,931 us | 4,505 us | +15% | 性能下降 |
|
|
|
+| YAML 保存 | 3,759 us | 4,470 us | +19% | 性能下降 |
|
|
|
+| 小文件保存 | 716 us | 987 us | +38% | 性能下降 |
|
|
|
+| 增量保存 | 864 us | 813 us | **-6%** | 略有提升 |
|
|
|
+| 异步保存 | 910 us | 738 us | **-19%** | 性能提升 |
|
|
|
+
|
|
|
+**结论**:异步保存性能提升 19%,同步保存性能有所下降。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 15. 源生成器测试 (SourceGeneratorBenchmarks)
|
|
|
+
|
|
|
+| 操作 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|------|-----------------|-----------------|------|------|
|
|
|
+| 生成类型读取 | 1,929 ns | 2,059 ns | +7% | 稳定 |
|
|
|
+| 反射读取 | 194,366 ns | 208,185 ns | +7% | 稳定 |
|
|
|
+| 生成类型写入 | 2,469 ns | 2,693 ns | +9% | 稳定 |
|
|
|
+| 直接属性访问 | 226 ns | 211 ns | **-7%** | 略有提升 |
|
|
|
+| 嵌套属性访问 | 230 ns | 354 ns | +54% | 性能下降 |
|
|
|
+
|
|
|
+**结论**:源生成器仍比反射快约 100 倍。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 16. 类型转换测试 (TypeConversionBenchmarks)
|
|
|
+
|
|
|
+| 转换类型 | 第一次 (.NET 8) | 第二次 (.NET 8) | 变化 | 说明 |
|
|
|
+|----------|-----------------|-----------------|------|------|
|
|
|
+| 字符串→整数 | 24.08 ns | 18.42 ns | **-24%** | 显著提升 |
|
|
|
+| 字符串→浮点 | 29.32 ns | 22.72 ns | **-23%** | 显著提升 |
|
|
|
+| 字符串→布尔 | 35.31 ns | 26.98 ns | **-24%** | 显著提升 |
|
|
|
+| 字符串→日期 | 44.23 ns | 34.79 ns | **-21%** | 显著提升 |
|
|
|
+| 字符串→枚举 | 80.09 ns | 58.43 ns | **-27%** | 显著提升 |
|
|
|
+| 字符串→Guid | 84.05 ns | 68.60 ns | **-18%** | 显著提升 |
|
|
|
+| 复杂类型转换 | 35,966 ns | 57,764 ns | +61% | 性能下降 |
|
|
|
+
|
|
|
+**重要发现**:基本类型转换性能提升 18-27%,复杂类型转换性能下降。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、.NET 9.0 vs .NET 10.0 对比
|
|
|
+
|
|
|
+以下对比第一次测试的 .NET 9.0 与第二次测试的 .NET 10.0 性能。
|
|
|
+
|
|
|
+### 关键性能指标对比
|
|
|
+
|
|
|
+| 操作 | .NET 9.0 (旧) | .NET 10.0 (新) | 变化 | 说明 |
|
|
|
+|------|---------------|----------------|------|------|
|
|
|
+| GetMany_10Keys | 315.8 ns | 341.4 ns | +8% | 稳定 |
|
|
|
+| Get_Loop_10Keys | 162.4 ns | 206.6 ns | +27% | 性能下降 |
|
|
|
+| HotPath_SameKey_1000 | 17,069 ns | 13,687 ns | **-20%** | 显著提升 |
|
|
|
+| 单次缓存命中读取 | 20.69 ns | 18.54 ns | **-10%** | 性能提升 |
|
|
|
+| 并发读取 (4线程) | 4.587 us | 5.493 us | +20% | 性能下降 |
|
|
|
+| 并发写入 (4线程) | 13.809 us | 15.977 us | +16% | 性能下降 |
|
|
|
+| 高并发写入 (16线程) | 35.948 us | 31.462 us | **-12%** | 性能提升 |
|
|
|
+| 根级别获取 | 29.33 ns | 20.92 ns | **-29%** | 显著提升 |
|
|
|
+| 直接键访问 | 4.99 ns | 4.22 ns | **-15%** | 性能提升 |
|
|
|
+| 简单路径解析 | 19.95 ns | 11.90 ns | **-40%** | 显著提升 |
|
|
|
+| 路径分割 | 3,334 ns | 3,013 ns | **-10%** | 性能提升 |
|
|
|
+| JSON 加载 | 365.6 us | 266.5 us | **-27%** | 显著提升 |
|
|
|
+| XML 加载 | 654.4 us | 536.6 us | **-18%** | 显著提升 |
|
|
|
+| TOML 加载 | 1,195 us | 831 us | **-30%** | 显著提升 |
|
|
|
+| 简单对象绑定 | 441.0 ns | 358.2 ns | **-19%** | 显著提升 |
|
|
|
+| 字符串读取 | 16.89 ns | 22.46 ns | +33% | 性能下降 |
|
|
|
+| 字符串写入 | 31.93 ns | 33.73 ns | +6% | 稳定 |
|
|
|
+| 单键删除 | 5.98 us | 5.30 us | **-11%** | 性能提升 |
|
|
|
+| JSON 保存 | 3,459 us | 4,173 us | +21% | 性能下降 |
|
|
|
+| 生成类型读取 | 1,744 ns | 2,244 ns | +29% | 性能下降 |
|
|
|
+| 字符串→整数 | 23.38 ns | 22.77 ns | **-3%** | 稳定 |
|
|
|
+| 字符串→枚举 | 75.43 ns | 51.33 ns | **-32%** | 显著提升 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、性能变化总结
|
|
|
+
|
|
|
+### 显著提升的操作 (.NET 8.0 对比)
|
|
|
+
|
|
|
+| 操作 | 提升幅度 | 说明 |
|
|
|
+|------|----------|------|
|
|
|
+| 1层嵌套获取 | **-34%** | 从 46.52 ns 降至 30.84 ns |
|
|
|
+| 路径合并 | **-33%** | 从 84.81 ns 降至 56.70 ns |
|
|
|
+| 双源合并读取 | **-32%** | 从 74.25 ns 降至 50.25 ns |
|
|
|
+| 深层嵌套获取 | **-32%** | 从 1,503 ns 降至 1,021 ns |
|
|
|
+| 路径分割 | **-31%** | 从 6,012 ns 降至 4,151 ns |
|
|
|
+| 动态源切换 | **-31%** | 从 5,669 ns 降至 3,897 ns |
|
|
|
+| 简单对象绑定 | **-29%** | 从 470.4 ns 降至 335.1 ns |
|
|
|
+| 根级别获取 | **-28%** | 从 29.60 ns 降至 21.33 ns |
|
|
|
+| 直接键访问 | **-28%** | 从 5.16 ns 降至 3.69 ns |
|
|
|
+| 复杂路径解析 | **-28%** | 从 36.28 ns 降至 26.16 ns |
|
|
|
+| 简单路径解析 | **-27%** | 从 18.84 ns 降至 13.68 ns |
|
|
|
+| 字符串读取 | **-27%** | 从 24.78 ns 降至 18.04 ns |
|
|
|
+| 源优先级解析 | **-27%** | 从 12,818 ns 降至 9,297 ns |
|
|
|
+| HotPath_SameKey_1000 | **-27%** | 从 18,196 ns 降至 13,359 ns |
|
|
|
+| 字符串→枚举 | **-27%** | 从 80.09 ns 降至 58.43 ns |
|
|
|
+| 单源读取 | **-26%** | 从 59.87 ns 降至 44.18 ns |
|
|
|
+| 子节点枚举 | **-26%** | 从 650 ns 降至 478 ns |
|
|
|
+| 单键删除 | **-25%** | 从 8.32 us 降至 6.20 us |
|
|
|
+| 高并发写入 | **-24%** | 从 40.236 us 降至 30.698 us |
|
|
|
+| 路径规范化 | **-24%** | 从 67,863 ns 降至 51,499 ns |
|
|
|
+| 字符串写入 | **-24%** | 从 34.74 ns 降至 26.54 ns |
|
|
|
+| 字符串→整数 | **-24%** | 从 24.08 ns 降至 18.42 ns |
|
|
|
+| 字符串→布尔 | **-24%** | 从 35.31 ns 降至 26.98 ns |
|
|
|
+| 大对象绑定 | **-23%** | 从 593,572 ns 降至 455,682 ns |
|
|
|
+| 缓存未命中读取 | **-23%** | 从 2,033 ns 降至 1,565 ns |
|
|
|
+| 字符串→浮点 | **-23%** | 从 29.32 ns 降至 22.72 ns |
|
|
|
+| 复杂对象绑定 | **-22%** | 从 2,329 ns 降至 1,810 ns |
|
|
|
+| 单次缓存命中读取 | **-22%** | 从 20.10 ns 降至 15.70 ns |
|
|
|
+
|
|
|
+### 性能下降的操作 (.NET 8.0 对比)
|
|
|
+
|
|
|
+| 操作 | 下降幅度 | 说明 |
|
|
|
+|------|----------|------|
|
|
|
+| 递归删除 | +143% | 从 902 us 升至 2,193 us |
|
|
|
+| 复杂类型转换 | +61% | 从 35,966 ns 升至 57,764 ns |
|
|
|
+| 嵌套属性访问 | +54% | 从 230 ns 升至 354 ns |
|
|
|
+| 并发读取 (4线程) | +42% | 从 4.654 us 升至 6.630 us |
|
|
|
+| 小文件保存 | +38% | 从 716 us 升至 987 us |
|
|
|
+| 节删除 | +37% | 从 949 us 升至 1,300 us |
|
|
|
+| Exists检查 | +32% | 从 3.304 us 升至 4.377 us |
|
|
|
+| 读写混合 | +31% | 从 3.088 us 升至 4.037 us |
|
|
|
+| XML 加载 | +31% | 从 504.6 us 升至 661.1 us |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、.NET 10.0 新增运行时性能亮点
|
|
|
+
|
|
|
+.NET 10.0 是本次测试新增的运行时,以下是其相对于 .NET 8.0 的性能特点:
|
|
|
+
|
|
|
+### .NET 10.0 优势场景
|
|
|
+
|
|
|
+| 场景 | .NET 8.0 | .NET 10.0 | 提升幅度 |
|
|
|
+|------|----------|-----------|----------|
|
|
|
+| 批量写入 (SetMany_10Keys) | 4,613 ns | 3,198 ns | **31%** |
|
|
|
+| 批量写入 (Set_Loop_10Keys) | 3,363 ns | 2,018 ns | **40%** |
|
|
|
+| 批量写入 (SetMany_100Keys) | 8,538 ns | 6,279 ns | **26%** |
|
|
|
+| 并发读取同一键 | 6.630 us | 5.493 us | **17%** |
|
|
|
+| 并发读取不同键 | 20.742 us | 15.977 us | **23%** |
|
|
|
+| 并发写入不同键 | 4.037 us | 3.084 us | **24%** |
|
|
|
+| 并发检查存在 | 21.069 us | 15.336 us | **27%** |
|
|
|
+| 配置绑定 | 720 ns | 510 ns | **29%** |
|
|
|
+| IConfiguration获取 | 7.05 ns | 5.49 ns | **22%** |
|
|
|
+| Scoped解析 | 9.49 ns | 6.54 ns | **31%** |
|
|
|
+| JSON 加载 | 276.5 us | 266.5 us | **4%** |
|
|
|
+| XML 加载 | 661.1 us | 536.6 us | **19%** |
|
|
|
+| TOML 加载 | 1,002 us | 831 us | **17%** |
|
|
|
+| 集合绑定 | 4,849 ns | 4,214 ns | **13%** |
|
|
|
+| 空值读取 | 22.00 ns | 15.61 ns | **29%** |
|
|
|
+| 单键删除 | 6.20 us | 5.30 us | **15%** |
|
|
|
+| 字符串→枚举 | 58.43 ns | 51.33 ns | **12%** |
|
|
|
+| 字符串→Guid | 68.60 ns | 61.95 ns | **10%** |
|
|
|
+
|
|
|
+### .NET 8.0 优势场景
|
|
|
+
|
|
|
+| 场景 | .NET 8.0 | .NET 10.0 | .NET 8 更快 |
|
|
|
+|------|----------|-----------|-------------|
|
|
|
+| 字符串读取 | 18.04 ns | 22.46 ns | **20%** |
|
|
|
+| 字符串写入 | 26.54 ns | 33.73 ns | **21%** |
|
|
|
+| 整数读取 | 18.67 ns | 22.64 ns | **18%** |
|
|
|
+| 布尔读取 | 19.15 ns | 22.98 ns | **17%** |
|
|
|
+| 字符串→整数 | 18.42 ns | 22.77 ns | **19%** |
|
|
|
+| 字符串→浮点 | 22.72 ns | 32.17 ns | **29%** |
|
|
|
+| 字符串→日期 | 34.79 ns | 39.88 ns | **13%** |
|
|
|
+| 源生成器读取 | 2,059 ns | 2,244 ns | **8%** |
|
|
|
+| 源生成器写入 | 2,693 ns | 2,892 ns | **7%** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、结论与建议
|
|
|
+
|
|
|
+### 主要改进(.NET 8.0 对比)
|
|
|
+
|
|
|
+1. **配置节获取性能大幅提升**:各层级获取性能提升 26-34%
|
|
|
+2. **键路径解析性能大幅提升**:解析和操作性能提升 24-33%
|
|
|
+3. **多源配置性能大幅提升**:各操作性能提升 21-32%
|
|
|
+4. **对象绑定性能大幅提升**:各类型绑定性能提升 19-29%
|
|
|
+5. **核心读写性能提升**:字符串读写性能提升 24-27%
|
|
|
+6. **缓存效果提升**:热路径和缓存命中性能提升 22-27%
|
|
|
+7. **类型转换性能提升**:基本类型转换性能提升 18-27%
|
|
|
+
|
|
|
+### .NET 10.0 特点
|
|
|
+
|
|
|
+1. **批量写入性能优异**:比 .NET 8 快 26-40%
|
|
|
+2. **并发性能优异**:并发读写性能提升 17-27%
|
|
|
+3. **DI 性能优异**:配置绑定和服务解析性能提升 22-31%
|
|
|
+4. **大文件处理优异**:XML/TOML 加载性能提升 17-19%
|
|
|
+5. **基本读写略慢**:字符串读写比 .NET 8 慢 17-21%
|
|
|
+
|
|
|
+### 需要关注的问题
|
|
|
+
|
|
|
+1. **递归删除性能下降**:性能下降 143%,需要调查
|
|
|
+2. **复杂类型转换性能下降**:性能下降 61%
|
|
|
+3. **4线程并发性能下降**:并发读取下降 42%
|
|
|
+4. **XML 加载性能下降**:.NET 8 上性能下降 31%
|
|
|
+
|
|
|
+### 运行时选择建议
|
|
|
+
|
|
|
+| 场景 | 推荐运行时 | 原因 |
|
|
|
+|------|------------|------|
|
|
|
+| 批量写入密集 | .NET 10.0 | 写入性能提升 26-40% |
|
|
|
+| 高并发场景 | .NET 10.0 | 并发性能提升 17-27% |
|
|
|
+| 基本读取密集 | .NET 8.0 | 读取性能更稳定 |
|
|
|
+| 类型转换密集 | .NET 8.0 | 基本类型转换更快 |
|
|
|
+| 大文件处理 | .NET 10.0 | XML/TOML 加载更快 |
|
|
|
+| 源生成器使用 | .NET 8.0 | 源生成器性能更稳定 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+*报告生成时间:2026-01-01*
|
|
|
+*对比版本:2025-12-29_180801 vs 2026-01-01_0211*
|