Skip to content

Commit c05171b

Browse files
committed
refactor(reconciler): align transition scheduling and commit phases closer to React
1 parent 13ce49b commit c05171b

27 files changed

Lines changed: 2958 additions & 77 deletions

examples/stress-test/README.md

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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 类似的组件记忆化

examples/stress-test/index.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env python3
2+
"""Stress test example for pyinkcli."""
3+
4+
from stress_test import main
5+
6+
if __name__ == "__main__":
7+
main()

0 commit comments

Comments
 (0)