解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# TarFile 性能测试
## 性能概览
`TarFile` 用于 `.tar` 归档读å–ä¸Žå›žå†™ï¼Œæ ¸å¿ƒè·¯å¾„åœ¨ `TarEntry` 头部解æž/写入与 512 å—节对é½è¡¥é›¶ã€‚
本次将 `TarFile.cs` 改为 `SpanReader/SpanWriter` 路径并消除çƒç‚¹ä¸´æ—¶åˆ†é…åŽï¼Œ**è€—æ—¶ä¸‹é™ 26%~40%ï¼Œå•æ¬¡åˆ†é…ä¸‹é™ 46%~59%**。
---
## 测试环境
| 项目 | 值 |
|------|----|
| CPU | Intel Core i9-10900K @ 3.70 GHz |
| OS | Windows 10 22H2 (19045.6456) |
| Runtime | .NET 10.0.3 |
| SDK | .NET SDK 10.0.103 |
| BenchmarkDotNet | 0.15.8 |
| ç¼–è¯‘æ¨¡å¼ | Release |
---
## 测试方法
- 基准类:`Benchmark/CompressionBenchmarks/TarFileBenchmark.cs`
- 傿•°ï¼š`EntryCount=8/64`,`PayloadSize=1024`
- 场景:
- `读å–Tarå½’æ¡£`:`TarFile.Read` 读å–内å˜ä¸çš„ tar æ•°æ®
- `读å–并回写Tarå½’æ¡£`:先 `Read` å† `Write`
- 对比方å¼ï¼š
- 优化å‰ï¼šæ”¹é€ `TarFile.cs` å‰è¿è¡Œä¸€è½®
- 优化åŽï¼š`SpanReader/SpanWriter` æ”¹é€ + 回归修å¤åŽå†è¿è¡Œä¸€è½®
---
## 测试结果
### 优化å‰ï¼ˆBaseline)
| Method | EntryCount | PayloadSize | Mean | Error | StdDev | Allocated |
|-------|-----------:|------------:|-----:|------:|-------:|----------:|
| 读å–Tarå½’æ¡£ | 8 | 1024 | 10.47 us | 0.348 us | 0.947 us | 11.37 KB |
| 读å–并回写Tarå½’æ¡£ | 8 | 1024 | 18.28 us | 0.464 us | 1.269 us | 44.09 KB |
| 读å–Tarå½’æ¡£ | 64 | 1024 | 58.94 us | 1.092 us | 2.532 us | 76.19 KB |
| 读å–并回写Tarå½’æ¡£ | 64 | 1024 | 143.73 us | 1.979 us | 1.851 us | 272.12 KB |
### 优化åŽï¼ˆSpanReader/SpanWriter)
| Method | EntryCount | PayloadSize | Mean | Error | StdDev | Allocated |
|-------|-----------:|------------:|-----:|------:|-------:|----------:|
| 读å–Tarå½’æ¡£ | 8 | 1024 | 6.396 us | 0.1278 us | 0.2885 us | 4.66 KB |
| 读å–并回写Tarå½’æ¡£ | 8 | 1024 | 12.142 us | 0.1647 us | 0.1541 us | 23.4 KB |
| 读å–Tarå½’æ¡£ | 64 | 1024 | 42.167 us | 0.7587 us | 1.2676 us | 30.98 KB |
| 读å–并回写Tarå½’æ¡£ | 64 | 1024 | 108.297 us | 0.5019 us | 0.4449 us | 136.8 KB |
---
## æ ¸å¿ƒæŒ‡æ ‡
> åžåæ¢ç®—:`ops/s = 1,000,000 / Mean(us)`
| 场景 | ä¼˜åŒ–å‰ ops/s | ä¼˜åŒ–åŽ ops/s | åžåæå‡ |
|------|-------------:|-------------:|---------:|
| 读å–Tar归档(8) | 95,511 | 156,348 | +63.7% |
| 读å–并回写Tar归档(8) | 54,705 | 82,359 | +50.5% |
| 读å–Tar归档(64) | 16,966 | 23,715 | +39.8% |
| 读å–并回写Tar归档(64) | 6,957 | 9,234 | +32.7% |
---
## 对比分æž
### 纵å‘:ä¸åŒè§„模趋势(EntryCount 8 -> 64)
- ä¼˜åŒ–å‰ `读å–Tarå½’æ¡£`:10.47 us -> 58.94 us(+462.8%)
- ä¼˜åŒ–åŽ `读å–Tarå½’æ¡£`:6.253 us -> 42.758 us(+583.8%)
- 说明:æ¡ç›®è§„模扩大åŽï¼Œè€—时主è¦ç”±æ•°æ®é历与内容拷è´ä¸»å¯¼ï¼›ä¼˜åŒ–åŽå›ºå®šæˆæœ¬ä¸‹é™æ˜Žæ˜¾ï¼Œä½†è§„模放大带æ¥çš„çº¿æ€§æˆæœ¬ä»åœ¨ã€‚
### 横å‘:åŒè§„模下å‰åŽå·®å¼‚
| 场景 | 耗时å˜åŒ– | 分é…å˜åŒ– |
|------|---------:|---------:|
| 读å–Tar归档(8) | -38.9% | -59.0% |
| 读å–并回写Tar归档(8) | -33.6% | -46.9% |
| 读å–Tar归档(64) | -28.5% | -59.3% |
| 读å–并回写Tar归档(64) | -24.7% | -49.7% |
---
## 性能瓶颈定ä½
### æ ¸å¿ƒç“¶é¢ˆç‚¹æ€»è§ˆ
| 优先级 | 瓶颈 | ä¼˜åŒ–æ”¶ç›Šå æ¯” | 当å‰å¼€é”€ï¼ˆä¼˜åŒ–å‰ï¼‰ | 优化åŽå®žæµ‹ | 内å˜èŠ‚çœ |
|--------|------|------------|---------|-----------|---------|
| P0 | å¤´éƒ¨å—æ®µå—ç¬¦ä¸²ä¸´æ—¶åˆ†é… | ~40% | 8 æ¡ç›®è¯»å– 11.37 KB | 4.66 KB | **59.0%** |
| P0 | è¡¥é½å†™å…¥ä¸´æ—¶æ•°ç»„åˆ†é… | ~30% | 8 æ¡ç›®è¯»å†™ 44.09 KB | 23.4 KB | **46.9%** |
| P1 | 大文件内容 CopyTo 缓冲ç–ç•¥ | ~15% | 固定 4096 缓冲 | 坿Œ‰åœºæ™¯è°ƒä¼˜ | 待评估 |
| P2 | 长文件å路径元数æ®é€’å½’ | ~10% | `TypeFlag=LongPath/LongLink` 递归写入 | 待基准é‡åŒ– | 待评估 |
| P3 | æ¡ç›®è§„模线性增长 | ~5% | 8→64 æ¡ç›®è€—æ—¶ +462.8% | +583.8%(线性ä¸å˜ï¼‰ | — |
### 关键内å˜ä¼˜åŒ–æ–¹å‘
| 优先级 | ä¼˜åŒ–æ–¹å‘ | 当å‰åˆ†é… | 优化åŽå®žæµ‹ | èŠ‚çœæ¯”例 | 实施方案 |
|--------|---------|---------|-----------|---------|---------|
| P0(已完æˆï¼‰ | 头部读写 Span 化 | 11.37 KB(8 æ¡ç›®è¯»å–) | 4.66 KB | **59.0%** | `SpanReader/SpanWriter` 替代 `Encoding.ASCII.GetBytes` + `Convert.ToString` |
| P0(已完æˆï¼‰ | è¡¥é½å†™å…¥é™æ€ç¼“冲å¤ç”¨ | 44.09 KB(8 æ¡ç›®è¯»å†™ï¼‰ | 23.4 KB | **46.9%** | 陿€ç¼“冲替代 `new Byte[padding]` / `new Byte[1024]` |
| P1 | 大文件 CopyTo 缓冲调优 | 4096 固定缓冲 | 按åžå场景调优 | 待评估 | 评估 8192/16384 缓冲对大文件åžåçš„å½±å“ |
| P2 | LongLink/LongPath 基准é‡åŒ– | æœªæµ‹é‡ | — | — | 补专门基准测试,é‡åŒ–è¶…é•¿è·¯å¾„å…ƒæ•°æ®æ¡ç›®æˆæœ¬ |
### å„场景优化å‰åŽå¯¹æ¯”
| 场景 | 优化å‰è€—æ—¶ | 优化åŽè€—æ—¶ | 速度æå‡ | 优化å‰åˆ†é… | 优化åŽåˆ†é… | 内å˜èŠ‚çœ |
|------|-----------|-----------|---------|-----------|-----------|---------|
| 读å–(8 æ¡ç›®ï¼‰ | 10.47 us | 6.40 us | **38.9%** | 11.37 KB | 4.66 KB | **59.0%** |
| 读写(8 æ¡ç›®ï¼‰ | 18.28 us | 12.14 us | **33.6%** | 44.09 KB | 23.4 KB | **46.9%** |
| 读å–(64 æ¡ç›®ï¼‰ | 58.94 us | 42.17 us | **28.5%** | 76.19 KB | 30.98 KB | **59.3%** |
| 读写(64 æ¡ç›®ï¼‰ | 143.73 us | 108.30 us | **24.7%** | 272.12 KB | 136.8 KB | **49.7%** |
### 瓶颈 1(P0ï¼Œå·²ä¼˜åŒ–ï¼‰ï¼šå¤´éƒ¨å—æ®µå¤„ç†
- **原实现**ï¼šå¤§é‡ `Encoding.ASCII.GetBytes(String)`ã€`Convert.ToString(...).PadLeft(...)`ã€`ReadString().Trim()` é€ æˆä¸é—´å¯¹è±¡åˆ†é…
- **优化åŽ**:`SpanReader/SpanWriter` 直接æ“作å—节缓冲区,消除ä¸é—´å—符串分é…
| å¼€é”€æ¥æº | 优化å‰å 比 | ä¼˜åŒ–åŽ | 说明 |
|---------|-----------|--------|------|
| ASCII.GetBytes å—ç¬¦ä¸²åˆ†é… | ~35% | 消除 | 改用 Span 直接写入 |
| Convert.ToString.PadLeft | ~25% | 消除 | 改用 SpanWriter æ ¼å¼åŒ–写入 |
| ReadString.Trim | ~20% | 消除 | 改用 SpanReader ç›´æŽ¥è§£æž |
| 其余逻辑 | ~20% | ä¿ç•™ | æ¡ç›®é历与数æ®å®šä½ |
### 瓶颈 2(P0,已优化):补é½å†™å…¥
- **原实现**ï¼šé¢‘ç¹ `new Byte[padding]` / `new Byte[1024]`ï¼Œåœ¨å¤§é‡æ¡ç›®ä¸‹ GC 压力显著
- **优化åŽ**:统一å¤ç”¨é™æ€ç¼“å†²åŒºï¼Œç¦æ¢çƒè·¯å¾„临时数组
### 瓶颈 3(P1):大文件内容å¤åˆ¶è·¯å¾„
- **现象**:`CopyTo` 使用固定 4096 缓冲区,大文件场景å¯èƒ½éžæœ€ä¼˜
- **æ ¹æº**ï¼šç¼“å†²åŒºå¤§å°æœªæ ¹æ®æ–‡ä»¶å¤§å°è‡ªé€‚应调整
- **优化方å‘**:评估 8192/16384 缓冲对åžå的影å“
### 瓶颈 4(P2):长文件å路径递归
- **现象**:`TypeFlag=LongPath/LongLink` æ—¶å˜åœ¨å…ƒæ•°æ®æ¡ç›®å†™å…¥é€’归风险
- **æ ¹æº**:超长路径需é¢å¤–å…ƒæ•°æ®æ¡ç›®ï¼Œé€’å½’å¢žåŠ å¤„ç†æ·±åº¦
- **优化方å‘**:补专门基准é‡åŒ–æˆæœ¬
---
## 优化建议
| 优先级 | æ–¹å‘ | 预期收益 | 实施方案 |
|--------|------|---------|---------|
| P0 ★★★(已完æˆï¼‰ | **SpanReader/SpanWriter 头部读写** | 耗时é™ä½Ž **26-40%**,分é…é™ä½Ž **46-59%** | 已用 Span 化路径替代å—符串拼装实现 |
| P0 ★★★(已完æˆï¼‰ | **对é½è¡¥é›¶å¤ç”¨é™æ€ç¼“冲** | 消除çƒè·¯å¾„ `new Byte[]` ä¸´æ—¶åˆ†é… | 已统一å¤ç”¨é™æ€ç¼“冲区 |
| P1 ★★☆ | **大文件 CopyTo 缓冲ç–略调优** | 大文件åžåæå‡ **10-20%**(待验è¯ï¼‰ | 评估 4096→8192/16384 缓冲对ä¸åŒæ–‡ä»¶å¤§å°çš„åžåå½±å“ |
| P2 ★☆☆ | **LongLink/LongPath 基准é‡åŒ–** | é‡åŒ–è¶…é•¿è·¯å¾„å…ƒæ•°æ®æ¡ç›®æˆæœ¬ | 补一组专门基准,覆盖 >100 å—符路径场景 |
---
## 结论
`TarFile.cs` çš„ Span åŒ–æ”¹é€ åœ¨ä¸æ”¹å˜å¤–部 API çš„å‰æä¸‹ï¼Œæ˜¾è‘—é™ä½Žäº†å¤´éƒ¨å¤„ç†ä¸Žå¯¹é½å†™å…¥çš„分é…开销;在 4 个基准场景ä¸å‡èŽ·å¾—ç¨³å®šæ”¶ç›Šï¼Œè¯´æ˜Žä¼˜åŒ–æœ‰æ•ˆä¸”å…·å¤‡æ™®é€‚æ€§ã€‚å¯¹å½“å‰å·¥ä½œè´Ÿè½½ï¼Œæ”¶ç›Šé‡ç‚¹ä¸º **é™ä½Ž GC 压力 + æå‡ä¸å°è§„模归档处ç†åžå**。
|