|
|
@@ -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)
|
|
|
|