diff --git a/Cargo.lock b/Cargo.lock index deddfef7..ea34afc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1095,7 +1095,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.6.3" +version = "0.6.4" dependencies = [ "chrono", "fast-float", @@ -1120,7 +1120,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.6.3" +version = "0.6.4" dependencies = [ "num-bigint", "oxide_log", @@ -1128,7 +1128,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1139,7 +1139,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.6.3" +version = "0.6.4" dependencies = [ "ansi_term", "bumpalo", @@ -1159,7 +1159,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.6.3" +version = "0.6.4" dependencies = [ "lru", "oxide_bytecode", @@ -1168,7 +1168,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1187,7 +1187,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1201,7 +1201,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.6.3" +version = "0.6.4" dependencies = [ "num-bigint", "oxc_allocator", @@ -1216,7 +1216,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1225,7 +1225,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.6.3" +version = "0.6.4" dependencies = [ "bumpalo", "dashmap", @@ -1240,7 +1240,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1252,7 +1252,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.6.3" +version = "0.6.4" dependencies = [ "tracing", "tracing-appender", @@ -1261,7 +1261,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1276,7 +1276,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1292,7 +1292,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.6.3" +version = "0.6.4" dependencies = [ "num-bigint", "num-traits", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.6.3" +version = "0.6.4" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.6.3" +version = "0.6.4" dependencies = [ "bumpalo", "hashbrown 0.14.5", @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.6.3" +version = "0.6.4" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 3d590a47..1b287e61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ members = [ ] [workspace.package] -version = "0.6.3" +version = "0.6.4" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_vm/tests/microbench.rs b/crates/oxide_vm/tests/microbench.rs index b3c228ae..f26cfcf5 100644 --- a/crates/oxide_vm/tests/microbench.rs +++ b/crates/oxide_vm/tests/microbench.rs @@ -1,6 +1,6 @@ //! 毫秒级热路径微基准套件:方向性过滤器,不是门禁。 //! -//! 十个 JS 循环用例加两个 intern 直调用例;JS 用例每用例 1 个预热 run 加 3 个测量 +//! 十一个 JS 循环用例加两个 intern 直调用例;JS 用例每用例 1 个预热 run 加 3 个测量 //! run,每 run 均为同一模块的 `Vm::run`(新建 VM 共享同一 KernelCore,免每用例重建 //! builtin world),3 轮取中位;intern 用例为 Rust 直调,三轮各二万五千次取中位, //! 未命中用例每轮换新键(同一键第二轮起走命中快路径,中位即被命中成本污染)。 @@ -21,7 +21,7 @@ //! 预热 run 的作用是分配器、代码缓存与表代际预热,不是 IC 预热。 //! //! 循环规模按「debug 全套件执行段 5 秒内」约束调参:debug 构建每指令税高(无内联、 -//! 分派 match 开销主导),各用例单轮 30 至 130 毫秒,十二用例合计约 4.7 秒。 +//! 分派 match 开销主导),各用例单轮 28 至 126 毫秒,十三用例合计约 4.8 秒。 //! 规模不是测量语义的一部分,方向判定只依赖相对变化,跨宿主对比绝对值无意义。 //! //! 日常入口 `cargo test -p oxide_vm micro`(名称过滤); @@ -235,6 +235,18 @@ fn micro_gc_churn() { measure_case("gc_churn", &churn_kernel(), &module, 500, 250_500.0, true); } +/// 纯对象字面量循环:两键字面量构造加属性读(gc_object 形态),覆盖对象构造 +/// 热路径(静态键装载期预内部化、构造期直读侧表)与 GC churn。debug 实测每迭代 +/// 约 77 微秒(端到端 gc_object 每迭代约 2.5 微秒的三十倍),按五秒预算取七百 +/// 迭代(方向判定只依赖相对变化,规模不改变相对差)。 +#[test] +fn micro_object_literal() { + let source = "var sum = 0; for (var i = 0; i < 700; i++) { \ + var obj = { a: i, b: i * 2 }; sum += obj.a + obj.b; } sum"; + let module = compile_module(source); + measure_case("object_literal", &shared_kernel(), &module, 700, 733_950.0, false); +} + // ── intern 直调用例(Rust 直调,分配成本微基准同款范式)────────────────────── /// intern 直调固定次数:五万次。十万次口径下全套件执行段超五秒预算,