diff --git a/设计方案文档.md b/设计方案文档.md index 4eca37a..d799fca 100644 --- a/设计方案文档.md +++ b/设计方案文档.md @@ -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 使用情况说明