perf: 对象统一入口 Box 化合并对象表退役晋升档

This commit is contained in:
2026-10-01 06:39:51 +00:00
parent 0e3992722e
commit 1711ae948b
13 changed files with 262 additions and 523 deletions
@@ -2,11 +2,12 @@
//! 确定性账目。
//!
//! 15 层满二叉树(32767 节点)在「写路径直通(不引克隆)+ 根 promote 深克隆」
//! 晋升语义下的三个确定性计数。run 末 session 表只含直 session 分配对象,
//! 整树节点字面量驻留 epoch;promote_rooted 把顶层 var 寄存器根的 epoch 原件
//! 深克隆为 session 内唯一副本。晋升语义或根处理改动后,若以下任一数值变化,
//! 说明 session 留存账目已变——须对照 tests/stress/mem_object_graph.js 的基线
//! (benchmark_baseline.json)复核后再更新本锚。
//! 晋升语义下的确定性计数。对象分配统一入口 Box 化后全部对象入统一表,
//! run 末统一表含整树节点字面量 + 每次 JS 调用无条件创建的 arguments 对象 +
//! 直 session 分配(函数对象与 prototype 子对象);promote_rooted 对 session
//! 对象全空转(统一表后无 epoch 原件可晋升)。晋升语义或根处理改动后,若以下
//! 任一数值变化,说明 session 留存账目已变——须对照 tests/stress/mem_object_graph.js
//! 的基线(benchmark_baseline.json)复核后再更新本锚。
use std::sync::Arc;
@@ -42,19 +43,16 @@ fn run_module(source: &str) -> Vm {
vm
}
/// 留存锚:逃逸写直通后 run 末 session 表只含直 session 分配的 2 枚对象
/// (makeNode 函数对象与其 prototype 子对象),整树节点字面量驻留 epoch,
/// 顶层 var 寄存器槽仍持有 epoch 原件(SET 路径不回写寄存器);测量点
/// promote_rooted 把寄存器原件深克隆进 session(转发表去重,整树 32767),
/// full GC 后逻辑存活集(整树 + 函数 2)在 session 内恰一份、无双计。
/// epoch 侧 65534 的 2× 与节点无关:其中 32767 是每次 JS 调用无条件创建的
/// arguments 对象(CREATE_ARGUMENTS),另 32767 才是节点字面量。
/// 留存锚:对象分配统一入口 Box 化后 run 末统一表含全部对象——整树节点
/// 字面量 32767 + 每次 JS 调用无条件创建的 arguments 对象 32767 + 直 session
/// 分配 2(makeNode 函数对象与其 prototype 子对象)= 65536。promote_rooted
/// 对 session 对象全空转(统一表后无 epoch 原件可晋升);full GC 后逻辑存活集
/// (整树 + 函数 2)在 session 内恰一份、无双计。
#[test]
fn object_graph_retention_anchor() {
let mut vm = run_module(OBJECT_GRAPH);
assert_eq!(vm.epoch_object_count(), 65534, "run 末 epoch 计数");
assert_eq!(vm.session_object_count(), 2, "run 末 session 直分配计数(函数对象 + prototype 子对象)");
assert_eq!(vm.session_object_count(), 65536, "run 末统一表计数(节点 + arguments + 直分配)");
vm.promote_rooted_epoch_objects();
vm.promote_session_epoch_refs();