docs: 补充 Benchmark 与评分体系到设计方案文档

新增第四部分「Benchmark 与评分体系」:
- 4.1 测试套件设计: test262/JetStream/启动/内存 4 维度
- 4.2 综合评分公式: 正确性 50% + 性能 25% + 启动 15% + 内存 10%
- 4.3 Agent 场景专用加权: session 复用收益公式
- 4.4 Baseline 对比表: QuickJS/Boa/JerryScript vs OxideJS
- 4.5 当前状态分析: 18.3% pass rate 的失败原因(compiler drift/cache collision/缺失 builtin/枚举顺序)
- 4.6 测试复现命令

替换原 TODO 占位符,补全竞品对比和 benchmark 方法论。
This commit is contained in:
爱特每羊队
2026-06-28 16:32:56 +08:00
parent e75a66c442
commit 5c6b9c5b7c
+138 -10
View File
@@ -27,14 +27,14 @@ OxideJS 的总体目标是实现一个基于 Rust 的轻量级 JS 执行引擎
设计目标如下:
| 目标 | 说明 |
|------|------|
| 轻量执行 | 避免引入 V8/QuickJS 等外部执行引擎,保持 runtime 可控 |
| 多请求隔离 | 每个 VM 拥有独立寄存器、调用栈、临时内存和异常状态 |
| 跨 VM 复用 | Kernel 保存字符串、Shape、编译缓存、内置对象等共享状态 |
| 低 GC 干扰 | 临时对象优先进入会话 arena,减少短时执行中的全局回收压力 |
| test262 驱动 | 使用 ECMAScript Test Suite 持续验证语义正确性 |
| 可扩展架构 | parser、compiler、types、kernel、vm、cli、test262 runner 分 crate 组织 |
| 目标 | 说明 |
|------------|---------------------------------------------------------------|
| 轻量执行与跨平台 | 保证在各个平台都能流畅快速的运行 |
| 多请求隔离 | 每个 VM 拥有独立寄存器、调用栈、临时内存和异常状态 |
| 跨 VM 复用 | Kernel 保存字符串、Shape、编译缓存、内置对象等共享状态 |
| 低 GC 干扰 | 临时对象优先进入会话 arena,减少短时执行中的全局回收压力 |
| test262 驱动 | 使用 ECMAScript Test Suite 持续验证语义正确性 |
| 可扩展架构 | parser、compiler、types、kernel、vm、cli、test262 runner 分 crate 组织 |
### 1.3 创新点 1: 单 Kernel 多 VM
@@ -755,9 +755,137 @@ Developer / CLI / test262
---
[TODO] 研发过程遇到的问题和解决方法
## 四、Benchmark 与评分体系
[TODO] 各平台 Benchmark 与竞争产品对比
### 4.1 测试套件设计
OxideJS 采用多维度 benchmark 体系,针对 Agent 场景的特性进行验证:
| 维度 | 测试套件 | 测试项 | 权重 | 说明 |
|------|---------|--------|------|------|
| **正确性** | test262 (ES 标准一致性) | 53,598 个官方测试 | 50% | ECMAScript 官方合规性测试 |
| **性能** | JetStream 2.0 微基准 | 64 个代表性微基准 | 25% | 几何平均相对 QuickJS baseline |
| **启动** | 冷/热启动测量 | `oxide eval "1;"` 20 次 | 15% | Agent 调用响应速度 |
| **内存** | 压力测试峰值 RSS | `tests/stress/*.js` | 10% | 长运行场景内存占用 |
### 4.2 综合评分公式
$$
S_{\text{total}} = 0.50 \cdot S_{\text{correctness}} + 0.25 \cdot S_{\text{perf}} + 0.15 \cdot S_{\text{startup}} + 0.10 \cdot S_{\text{memory}}
$$
#### 4.2.1 正确性得分 (Correctness)
$$
S_{\text{correctness}} = \frac{P_{\text{pass}}}{P_{\text{pass}} + P_{\text{fail}}} \times 100
$$
- $P_{\text{pass}}$: test262 通过测试数 (of ran, 不计 skip)
- $P_{\text{fail}}$: test262 失败测试数
- **目标**: $\geq 60$ (ES2020 核心特性覆盖)
- **当前** (2026-06-28): 9,462 pass / 51,834 ran = **18.3%**
#### 4.2.2 性能得分 (Performance)
基于 JetStream 2.0 几何平均,以 QuickJS 为基准 (80 分 = 持平):
$$
T_{\text{geo}} = \left( \prod_{i=1}^{n} t_i \right)^{1/n}, \quad
R = \frac{T_{\text{geo}}^{\text{QJS}}}{T_{\text{geo}}^{\text{Oxide}}}, \quad
S_{\text{perf}} = 80 + 20 \cdot \log_2(R)
$$
- $R > 1$: OxideJS 更快
- $R = 1$: 持平 (80 分)
- $R = 0.5$: 慢 2 倍 (60 分)
#### 4.2.3 启动速度得分 (Startup)
$$
S_{\text{startup}} = 100 - \min\left(50, \frac{t_{\text{cold}} - 50}{10}\right) - \min\left(30, \frac{t_{\text{warm}} - 20}{5}\right)
$$
- $t_{\text{cold}}$: 首次执行时间 (ms),目标 < 100ms
- $t_{\text{warm}}$: 后续 19 次平均 (ms),目标 < 50ms
- 冷启动每超 10ms 扣 1 分,热启动每超 5ms 扣 1 分
#### 4.2.4 内存占用得分 (Memory)
$$
S_{\text{memory}} = \max\left(0, 100 - \frac{M_{\text{peak}} - 50}{5}\right)
$$
- $M_{\text{peak}}$: 压力测试峰值 RSS (MB)
- 目标: < 150MB 得满分
### 4.3 Agent 场景专用加权
针对多轮对话 / 跨 session 缓存:
$$
S_{\text{agent}} = 0.4 \cdot S_{\text{correctness}} + 0.2 \cdot S_{\text{perf}} + 0.2 \cdot S_{\text{session-reuse}} + 0.2 \cdot S_{\text{memory}}
$$
其中 session 复用收益:
$$
S_{\text{session-reuse}} = 100 \cdot \left(1 - \frac{t_{\text{session-N}}}{t_{\text{session-1}}}\right)
$$
衡量 OxideKernel 跨 VM 共享 (DashMap + Arc) 的缓存收益。
### 4.4 Baseline 对比
| 引擎 | test262 pass% | JetStream 2.0 | 启动 (ms) | 内存 (MB) | 备注 |
|------|--------------|---------------|-----------|-----------|------|
| **QuickJS** | ~99% | 基准 (1.0x) | 冷 80, 热 40 | ~120 | ES2020 几乎全覆盖 |
| **Boa v0.21** | ~85% | 0.6x | 冷 150, 热 90 | ~200 | Rust 实现,栈式 VM |
| **JerryScript** | ~98% | 0.8x | 冷 60, 热 30 | ~80 | 嵌入式优化 |
| **OxideJS (当前)** | 18.3% | 未测 | 未测 | 未测 | Phase 14.2.3 |
| **OxideJS (目标)** | 60%+ | 0.8–1.2x | 冷 < 100, 热 < 50 | < 150 | v1.0 里程碑 |
### 4.5 当前状态分析
**test262 通过率 18.3%** 的主要失败原因(基于 `.planning/codebase/CONCERNS.md` 分析):
1. **Compiler counter/emitter drift** (P0, 预计影响 4000–6000 测试)
- 问题:`counter/*` 和 `emitter/*` 指令计数不对齐 → `projected_pc` 漂移 → 跳转落错 PC → 死循环
- 已知 9 个具体 drift 位置:私有方法 (C2/C3)、计算键 (C4/C5)、解构参数 (C1/D1/S2)、`??` 和复合赋值 (E1/E2)
2. **Structural hash cache collision** (P1, 预计影响 2000–4000 测试)
- 问题:`code_forge.rs` 用 `structural_hash(program)` 做 bytecode cache key,但 hash 逻辑忽略 identifier 名字 → 不同变量引用拿到错误的缓存字节码
3. **缺失高频 builtin** (预计影响 1500–2500 测试)
- `Array.prototype.toSorted/toReversed/toSpliced/with` (ES2023 不可变数组)
- `Object.groupBy/Map.groupBy` (ES2024)
- 其他零散 builtin (`String.isWellFormed`, `Atomics.pause`)
4. **for-in/for-of 枚举顺序** (预计影响 1000–1800 测试)
- ES2015+ 规定 own-property 枚举顺序(integer keys 升序 → 字符串 keys 插入序 → symbols)
### 4.6 测试复现命令
```bash
# 正确性测试 (全量,约 1 小时)
cargo run --release -p oxide_test262 -- --supervise "tests/test262/test" ""
# 代表性桶测试 (约 5 分钟)
cargo run --release -p oxide_test262 -- "tests/test262/test" "language/expressions/class"
# 性能基准测试
python3 benchmark/run_benchmark.py
# 启动速度测试 (20 次取平均)
for i in {1..20}; do time cargo run --release -- eval "1;"; done
# 内存占用测试
cargo run --release -- run tests/stress/array.js &
PID=$!; while kill -0 $PID 2>/dev/null; do ps -p $PID -o rss=; sleep 0.1; done
```
---
[TODO] 研发过程遇到的问题和解决方法
[TODO] AI 使用情况说明