|
| 1 | +# Stress Test Examples - 性能压力测试 |
| 2 | + |
| 3 | +这些例子用于测试和演示 pyinkcli 在大量组件情况下的渲染性能。 |
| 4 | + |
| 5 | +## 测试例子 |
| 6 | + |
| 7 | +### 1. 基础压力测试 (stress-test.py) |
| 8 | + |
| 9 | +测试大量列表项在持续更新时的性能表现。 |
| 10 | + |
| 11 | +```bash |
| 12 | +# 默认测试 (500 个元素) |
| 13 | +python stress-test.py |
| 14 | + |
| 15 | +# 自定义元素数量 |
| 16 | +python stress-test.py --items 1000 |
| 17 | + |
| 18 | +# 启用并发模式 |
| 19 | +python stress-test.py --items 1000 --concurrent |
| 20 | + |
| 21 | +# 更快更新频率 |
| 22 | +python stress-test.py --items 500 --update-interval 0.5 |
| 23 | +``` |
| 24 | + |
| 25 | +**功能特性:** |
| 26 | +- 可配置数量的列表项 (默认 500) |
| 27 | +- 自动周期性更新 (默认每 1 秒更新 10% 的项) |
| 28 | +- 实时 FPS 和渲染时间显示 |
| 29 | +- 支持键盘导航 (上下箭头、PageUp/PageDown) |
| 30 | +- 按 `T` 键暂停/恢复自动更新 |
| 31 | +- 按 `R` 键重置数据 |
| 32 | + |
| 33 | +### 2. 极端压力测试 (stress-test-extreme.py) |
| 34 | + |
| 35 | +**专门设计用于复现 UI 冻结问题**。使用故意慢的计算来模拟真实应用中的重负载。 |
| 36 | + |
| 37 | +### 3. 对比测试 (stress-test-compare.py) |
| 38 | + |
| 39 | +**并排对比 Sync 和 Concurrent 模式的差异**。左侧是同步渲染,右侧是并发渲染。 |
| 40 | + |
| 41 | +```bash |
| 42 | +# 默认对比 (300 个元素) |
| 43 | +python stress-test-compare.py |
| 44 | + |
| 45 | +# 自定义元素数量和计算延迟 |
| 46 | +python stress-test-compare.py --items 500 --delay 5 |
| 47 | +``` |
| 48 | + |
| 49 | +**说明:** |
| 50 | +- 左侧 (红色):Sync 模式 - 每次更新都会阻塞 UI |
| 51 | +- 右侧 (绿色):Concurrent 模式 - 更新可以被中断,UI 保持响应 |
| 52 | + |
| 53 | +```bash |
| 54 | +# 默认测试 (1000 个元素,同步模式 - 会卡!) |
| 55 | +python stress-test-extreme.py |
| 56 | + |
| 57 | +# 更多元素 (小心!会更卡) |
| 58 | +python stress-test-extreme.py --items 2000 |
| 59 | + |
| 60 | +# 并发模式对比 |
| 61 | +python stress-test-extreme.py --items 1000 --concurrent |
| 62 | +``` |
| 63 | + |
| 64 | +**警告:** 此测试故意使用 5ms/项的计算时间,1000 项 = 每帧 5 秒计算时间! |
| 65 | + |
| 66 | +## 观察指标 |
| 67 | + |
| 68 | +| FPS | 状态 | 说明 | |
| 69 | +|-----|------|------| |
| 70 | +| > 30 | GOOD | 流畅 | |
| 71 | +| 10-30 | LAGGY | 有卡顿 | |
| 72 | +| < 10 | FREEZING | 严重卡顿/冻结 | |
| 73 | + |
| 74 | +## 性能问题分析 |
| 75 | + |
| 76 | +当组件数量很大时,每次更新会导致: |
| 77 | + |
| 78 | +1. **整个组件树重新渲染** |
| 79 | +2. **useMemo 缓存失效**,触发大量重新计算 |
| 80 | +3. **单线程阻塞** - Python GIL 导致无法并行 |
| 81 | + |
| 82 | +## 对比测试 |
| 83 | + |
| 84 | +对比同步模式和并发模式的差异: |
| 85 | + |
| 86 | +```bash |
| 87 | +# 同步模式 (卡顿) |
| 88 | +python stress-test-extreme.py --items 500 |
| 89 | + |
| 90 | +# 并发模式 (应该更流畅) |
| 91 | +python stress-test-extreme.py --items 500 --concurrent |
| 92 | +``` |
| 93 | + |
| 94 | +## 键盘控制 |
| 95 | + |
| 96 | +| 按键 | 功能 | |
| 97 | +|------|------| |
| 98 | +| ↑↓ | 上下导航 | |
| 99 | +| PageUp/PageDown | 快速翻页 | |
| 100 | +| R | 重置数据 | |
| 101 | +| T | 暂停/恢复更新 (stress-test.py) | |
| 102 | +| Enter | 手动触发更新 | |
| 103 | +| Ctrl+C | 退出 | |
| 104 | + |
| 105 | +**对比测试专用控制 (stress-test-compare.py):** |
| 106 | +| 按键 | 功能 | |
| 107 | +|------|------| |
| 108 | +| ↑ | 触发 Sync 更新 | |
| 109 | +| ↓ | 触发 Concurrent 更新 | |
| 110 | +| Enter | 同时触发两种更新 | |
| 111 | + |
| 112 | +## 建议测试场景 |
| 113 | + |
| 114 | +1. **基准测试**: `--items 100` - 建立性能基准 |
| 115 | +2. **中等负载**: `--items 500` - 模拟真实应用 |
| 116 | +3. **压力测试**: `--items 1000+` - 测试极限 |
| 117 | +4. **并发对比**: 同配置对比 sync vs concurrent |
| 118 | + |
| 119 | +## 调试建议 |
| 120 | + |
| 121 | +如果发现性能问题: |
| 122 | + |
| 123 | +1. 减少不必要的 `useMemo` 依赖 |
| 124 | +2. 使用 `useTransition` 将非关键更新降级 |
| 125 | +3. 虚拟化长列表 (只渲染可见区域) |
| 126 | +4. 考虑使用 React.memo 类似的组件记忆化 |
0 commit comments