Browse Source

解读性能测试结果

黄中银 2 weeks ago
parent
commit
224b26b4b0
1 changed files with 74 additions and 70 deletions
  1. 74 70
      README.md

+ 74 - 70
README.md

@@ -220,105 +220,108 @@ dotnet run -c Release
 
 - 系统:Windows 11
 - SDK:.NET SDK 9.0.308
-- 测试运行时:.NET 6.0、.NET 8.0、.NET 9.0
+- 测试运行时:.NET 6.0.36、.NET 8.0.22、.NET 9.0.11
+- 测试日期:2025-12-25
 
 ---
 
 ### 1. 读写基准测试 (ReadWriteBenchmarks)
 
-#### 获取整数值 (GetInt) - 最快操作
+#### 基本操作性能
 
-| 格式 | .NET 9.0 | .NET 8.0 | .NET 6.0 |
-|------|----------|----------|----------|
-| Json | **80 ns** | 90 ns | 142 ns |
-| Xml | 83 ns | 88 ns | 143 ns |
-| Toml | 83 ns | 88 ns | 144 ns |
-| Yaml | 84 ns | 87 ns | 143 ns |
-| Ini | 84 ns | 89 ns | 140 ns |
+| 操作 | .NET 9.0 | .NET 8.0 | .NET 6.0 | 说明 |
+|------|----------|----------|----------|------|
+| Get (字符串) | **16 ns** | 16 ns | 26 ns | 零内存分配 |
+| Exists | **16 ns** | 16 ns | 26 ns | 零内存分配 |
+| Set | **19 ns** | 19 ns | 26 ns | 零内存分配 |
+| GetInt | **70 ns** | 75 ns | 164 ns | 类型转换 |
 
 **结论**:
 
 - 所有格式性能接近,差异在误差范围内
-- **.NET 9.0 比 .NET 6.0 快约 40-45%**
+- **.NET 8/9 比 .NET 6 快约 38%**(基本操作)
+- **.NET 9 类型转换比 .NET 6 快约 57%**
 - 内存分配:.NET 9.0 (64B) < .NET 8.0 (88B) < .NET 6.0 (128B)
 
-#### 其他操作耗时排序
-
-| 操作 | 耗时范围 |
-|------|----------|
-| GetInt | 80-143 ns |
-| Exists | 288-330 ns |
-| Set | 303-356 ns |
-| Get (字符串) | 324-380 ns |
-
 ---
 
 ### 2. 大文件基准测试 (LargeFileBenchmarks)
 
-#### 100 条配置项
-
-| 格式 | 最快运行时 | 耗时 | 内存 |
-|------|-----------|------|------|
-| **Json** | .NET 8.0 | **259 μs** | 61 KB |
-| **Ini** | .NET 8.0 | **260 μs** | 53 KB |
-| Xml | .NET 8.0 | 334 μs | 154 KB |
-| Yaml | .NET 9.0 | 412 μs | 156 KB |
-| Toml | .NET 9.0 | 514 μs | 258 KB |
-
-#### 1000 条配置项
+#### 1000 条配置项加载性能
 
-| 格式 | 最快运行时 | 耗时 | 内存 |
-|------|-----------|------|------|
-| **Ini** | .NET 6.0 | **589 μs** | 327 KB |
-| **Json** | .NET 9.0 | **667 μs** | 381 KB |
-| Xml | .NET 9.0 | 1,082 μs | 1,161 KB |
-| Yaml | .NET 9.0 | 1,524 μs | 1,277 KB |
-| Toml | .NET 9.0 | 1,502 μs | 2,365 KB |
-
-#### 5000 条配置项
-
-| 格式 | 最快运行时 | 耗时 | 内存 |
-|------|-----------|------|------|
-| **Ini** | .NET 6.0 | **2,460 μs** | 1,524 KB |
-| **Json** | .NET 6.0 | **2,707 μs** | 1,800 KB |
-| Xml | .NET 9.0 | 4,666 μs | 5,730 KB |
-| Yaml | .NET 9.0 | 6,802 μs | 6,226 KB |
-| Toml | .NET 9.0 | 8,326 μs | 11,644 KB |
+| 格式 | .NET 9.0 | .NET 8.0 | .NET 6.0 | 内存 |
+|------|----------|----------|----------|------|
+| **Ini** | **197 μs** | 198 μs | 251 μs | 318 KB |
+| **Json** | **252 μs** | 257 μs | 267 μs | 380 KB |
+| Xml | 633 μs | 527 μs | 571 μs | 1,160 KB |
+| Yaml | 849 μs | 974 μs | 1,217 μs | 1,275 KB |
+| Toml | 906 μs | 948 μs | 1,200 μs | 2,364 KB |
 
 **结论**:
 
 - **Ini 和 Json 是大文件场景的最佳选择**
+- Ini 比 Json 快约 22%,内存少 16%
 - Toml 内存占用最高(约为 Json 的 6 倍)
-- 数据量越大,格式间差异越明显
+- .NET 9 在 Yaml/Toml 解析上比 .NET 6 快约 25-30%
 
 ---
 
 ### 3. 并发基准测试 (ConcurrencyBenchmarks)
 
-#### 单线程 (ThreadCount=1)
+#### 4 线程并发(Json 配置源)
 
 | 操作 | .NET 9.0 | .NET 8.0 | .NET 6.0 |
 |------|----------|----------|----------|
-| 读不同键 | **37 μs** | 47 μs | 54 μs |
-| 读相同键 | **38 μs** | 46 μs | 52 μs |
-| 写不同键 | **39 μs** | 42 μs | 46 μs |
-| 混合读写 | **66 μs** | 68 μs | 76 μs |
-| Exists | 72 μs | 64 μs | 78 μs |
+| 读相同键 | **2.9 μs** | 2.9 μs | 5.7 μs |
+| 读不同键 | **3.2 μs** | 3.3 μs | 6.2 μs |
+| Exists | **4.6 μs** | 4.5 μs | 12.1 μs |
+| 混合读写 | **11.7 μs** | 16.2 μs | 22.2 μs |
+| 写不同键 | **14.8 μs** | 18.9 μs | 25.2 μs |
+| 写相同键 | **38.0 μs** | 42.0 μs | 43.8 μs |
 
-#### 8 线程并发
+**结论**:
 
-| 操作 | .NET 9.0 | .NET 8.0 | .NET 6.0 |
+- 并发读性能优秀,.NET 8/9 比 .NET 6 快约 50%
+- 混合读写场景 .NET 9 比 .NET 6 快约 47%
+- 线程安全,支持高并发访问
+
+---
+
+### 4. 缓存效果测试 (CacheBenchmarks)
+
+| 场景 | .NET 9.0 | .NET 8.0 | .NET 6.0 |
 |------|----------|----------|----------|
-| 读相同键 | 455 μs | **399 μs** | 446 μs |
-| 写不同键 | **439 μs** | 452 μs | 422 μs |
-| 混合读写 | **645 μs** | 779 μs | 896 μs |
-| Exists | 924 μs | 1,030 μs | 885 μs |
+| 热路径读取 (1000次) | **13.7 μs** | 12.9 μs | 21.1 μs |
+| 首次访问 | **15 ns** | 15 ns | 23 ns |
+| 后续访问 (预热后) | **1.4 μs** | 1.5 μs | 2.4 μs |
+| 缓存未命中 (1000次) | **13.6 μs** | 12.7 μs | 22.2 μs |
+
+**结论**:
+
+- 热路径读取性能稳定,.NET 8/9 比 .NET 6 快约 35%
+- 首次访问仅需 15 ns,几乎无开销
+- 缓存命中与未命中性能差异小,设计合理
+
+---
+
+### 5. 类型转换测试 (TypeConversionBenchmarks)
+
+| 类型 | .NET 9.0 | .NET 8.0 | .NET 6.0 | 内存 (.NET 9) |
+|------|----------|----------|----------|---------------|
+| String | **18 ns** | 19 ns | 25 ns | 0 B |
+| Int | **88 ns** | 74 ns | 143 ns | 64 B |
+| Bool | **66 ns** | 94 ns | 107 ns | 64 B |
+| Double | **121 ns** | 104 ns | 140 ns | 64 B |
+| Guid | **80 ns** | 115 ns | 161 ns | 72 B |
+| DateTime | **135 ns** | 203 ns | 209 ns | 64 B |
+| Enum | **93 ns** | 157 ns | 240 ns | 64 B |
 
 **结论**:
 
-- 并发读写性能良好,线程数增加时耗时近似线性增长
-- .NET 9.0 在混合读写场景优势明显(比 .NET 6.0 快 28%)
-- 内存分配随 .NET 版本升级持续优化
+- .NET 9 在复杂类型转换上优势明显
+- Enum 转换 .NET 9 比 .NET 6 快约 61%
+- DateTime 转换 .NET 9 比 .NET 6 快约 35%
+- 内存分配持续优化:.NET 9 (64B) < .NET 8 (88B) < .NET 6 (128B)
 
 ---
 
@@ -334,17 +337,18 @@ dotnet run -c Release
 
 #### 运行时建议
 
-- **推荐 .NET 8.0 或 .NET 9.0**,性能比 .NET 6.0 提升 30-45%
+- **推荐 .NET 8.0 或 .NET 9.0**,性能比 .NET 6.0 提升 35-60%
 - 内存分配优化显著,GC 压力更小
+- .NET 9 在类型转换和并发场景优势明显
 
 #### 使用建议
 
-| 场景 | 推荐格式 |
-|------|----------|
-| 高频读写 | Json / Ini |
-| 大配置文件 | Ini / Json |
-| 人类可读性优先 | Yaml / Toml |
-| 与现有系统集成 | Xml |
+| 场景 | 推荐格式 | 说明 |
+|------|----------|------|
+| 高频读写 | Json / Ini | 单次操作 16-20 ns |
+| 大配置文件 | Ini / Json | Ini 内存最省 |
+| 人类可读性优先 | Yaml / Toml | 性能可接受 |
+| 与现有系统集成 | Xml | 兼容性好 |
 
 > 性能测试运行方法见 [benchmarks/README.md](benchmarks/README.md)