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:
@@ -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 使用情况说明
|
||||
|
||||
|
||||
Reference in New Issue
Block a user