mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
bench: 主判改确定性列零容差并重锚全谱基线
This commit is contained in:
+92
-80
@@ -1,81 +1,81 @@
|
||||
Test Name Wall(ms) Comp(ms) Exec(ms) Instrs GC Ct IC Rate Sess Objs Sess B Peak B Ret B
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
arith_ops 292.31 0.330 291.981 4700023 0 0.0% 0 0 0 0
|
||||
array_filter 671.88 0.332 671.545 55739 1 99.9% 1586 364264 417620 2744
|
||||
array_for_each 687.85 0.368 687.482 35737 1 99.9% 1536 354168 425828 960
|
||||
array_index_get 126.51 0.299 126.214 1817037 0 99.9% 0 38000 38000 8160
|
||||
array_index_set 97.82 0.277 97.541 1517035 0 99.9% 0 38000 38000 8160
|
||||
array_join 519.66 0.286 519.374 4140029 0 100.0% 0 9380000 9380000 291
|
||||
array_literal 88.53 0.235 88.297 1500025 0 100.0% 0 0 184 184
|
||||
array_map 640.06 0.344 639.717 55739 1 99.9% 1586 367464 417620 4344
|
||||
array_push_pop 1256.85 0.294 1256.556 10200029 0 100.0% 0 20900000 20900000 472
|
||||
array_reduce 669.22 0.351 668.863 57739 1 99.9% 1536 354200 425828 1960
|
||||
array_slice 75.83 0.321 75.510 79739 0 99.9% 0 10401800 10401800 4344
|
||||
array_sort 132.42 0.335 132.087 17939 0 99.7% 1000 1888800 1888800 4344
|
||||
branch_if 144.76 0.253 144.506 2816690 0 0.0% 0 0 0 0
|
||||
branch_switch 138.35 0.300 138.046 3000023 0 0.0% 0 0 0 0
|
||||
call_args 95.90 0.349 95.549 880029 0 0.0% 2 307 595 595
|
||||
call_closure 68.26 0.281 67.977 500044 0 0.0% 4 613 1221 1221
|
||||
call_method 76.85 0.269 76.581 580032 0 50.0% 2 307 771 771
|
||||
call_new_proto 137.85 0.301 137.553 800037 0 33.3% 4 614 1390 1390
|
||||
call_recursion 997.96 0.288 997.675 5527429 1 0.0% 3 1027 1027 595
|
||||
call_this 127.50 0.347 127.147 780034 0 50.0% 4 624 1384 1384
|
||||
cmp_ops 423.75 0.241 423.503 5800025 0 0.0% 0 0 0 0
|
||||
code_forge 782.39 0.233 782.152 110018 0 0.0% 10000 1651670 1651670 0
|
||||
coercion_boolean 255.43 0.256 255.171 4450023 0 0.0% 0 0 0 0
|
||||
coercion_concat 196.16 0.296 195.865 2300025 0 0.0% 0 3888890 3888890 39
|
||||
coercion_nullish 359.31 0.314 359.001 5100032 0 50.0% 0 0 168 168
|
||||
coercion_tonumber 138.29 0.280 138.014 2600023 0 0.0% 0 0 0 0
|
||||
coercion_toprimitive 200.85 0.325 200.521 500025 1 0.0% 18343 4075840 9604479 1591
|
||||
coercion_tostring 375.71 0.311 375.396 4600025 0 0.0% 0 22200000 22200000 186
|
||||
gc_array 568.75 0.326 568.420 4390027 0 100.0% 0 9500000 9500000 560
|
||||
gc_object 129.88 0.276 129.604 1550025 0 100.0% 0 0 176 176
|
||||
gc_string 39.54 0.228 39.310 460025 0 0.0% 0 788890 788890 40
|
||||
gc_string_long 2015.98 0.196 2015.788 23000025 2 0.0% 0 7334531 33554441 41
|
||||
ic_cache 53.16 0.419 52.736 554039 0 78.9% 0 380000 1802832 1802832
|
||||
ic_polymorphic 226.85 0.371 226.484 4033387 0 100.0% 0 0 552 552
|
||||
loop_do_while 235.37 0.231 235.138 3000019 0 0.0% 0 0 0 0
|
||||
loop_for 1201.43 0.236 1201.195 16000023 0 0.0% 0 0 0 0
|
||||
loop_for_in 637.77 0.521 637.250 7591739 0 0.0% 0 3490 3490 960
|
||||
loop_for_of 311.52 0.490 311.026 3652739 0 99.0% 0 111800 111800 960
|
||||
loop_for_of_string 217.30 0.319 216.984 2726339 0 0.0% 0 58150 58150 132
|
||||
loop_index 410.42 0.370 410.048 6367739 0 100.0% 0 3800 3800 960
|
||||
loop_while 1213.66 0.224 1213.438 16000023 0 0.0% 0 0 0 0
|
||||
loop_while_index 424.75 0.595 424.150 6667739 0 100.0% 0 3800 3800 960
|
||||
map_ops 768.64 0.496 768.140 12650027 0 100.0% 0 0 672 672
|
||||
math_ops 458.98 0.399 458.576 6500023 0 0.0% 0 0 0 0
|
||||
mem_array_grow 384.49 0.276 384.214 3800024 0 0.0% 0 0 8160 8160
|
||||
mem_closure_chain 124.14 0.569 123.574 590034 0 0.0% 40000 6718890 10479658 10479658
|
||||
mem_cross_call_retain 256.70 0.385 256.314 1590032 0 25.0% 2 3810453 8431077 8431077
|
||||
mem_map_retain 59.05 0.260 58.788 600021 0 100.0% 0 1977780 6436740 6436740
|
||||
mem_object_graph 120.98 0.356 120.624 884727 0 0.0% 2 312 6029720 6029720
|
||||
mem_set_retain 43.20 0.223 42.975 460021 0 100.0% 0 1088890 4769098 4769098
|
||||
mem_string_accum 109.56 0.222 109.333 960020 0 0.0% 0 2744473 3064633 3064633
|
||||
mem_string_rope 2.29 0.188 2.101 16025 6 0.0% 0 124184000 124184000 124184000
|
||||
member_compound 303.24 0.340 302.896 4400076 0 100.0% 0 0 1064 1064
|
||||
object_keys 492.55 0.441 492.113 3740027 0 100.0% 0 13800000 13800000 320
|
||||
prop_access 170.65 0.278 170.374 2800036 0 100.0% 0 0 192 192
|
||||
prop_bracket 161.16 0.295 160.861 2100036 0 100.0% 0 0 184 184
|
||||
prop_delete 55.56 0.297 55.259 480034 0 50.0% 0 0 184 184
|
||||
prop_dynamic 77.61 0.272 77.341 1100028 0 100.0% 0 0 168 168
|
||||
prop_nested 136.23 0.282 135.945 1550025 0 100.0% 0 0 504 504
|
||||
prop_set 204.89 0.235 204.654 3200032 0 100.0% 0 0 176 176
|
||||
property 150.99 0.305 150.680 111035 0 0.0% 0 231780 231780 24160
|
||||
set_ops 668.58 0.288 668.288 9950027 0 90.9% 0 0 288 288
|
||||
string_build 1735.11 0.391 1734.715 16560027 4 0.0% 0 6791197 33554520 122
|
||||
string_case 185.22 0.249 184.970 1600028 0 0.0% 0 7600000 7600000 0
|
||||
string_char 299.02 0.247 298.770 3800025 0 0.0% 0 0 0 0
|
||||
string_concat 172.78 0.352 172.422 1800031 0 0.0% 0 1900000 1900000 38
|
||||
string_indexof 87.36 0.215 87.144 1100028 0 0.0% 0 0 0 0
|
||||
string_replace 53.14 0.288 52.852 600030 0 0.0% 0 1320000 1320000 66
|
||||
string_replace_fn 789.77 0.408 789.367 64987 3 0.0% 294 1619217 33571047 12433
|
||||
string_split 99.13 0.249 98.877 540030 0 100.0% 0 17160000 17160000 1226
|
||||
string_substring 122.30 0.259 122.040 1500030 0 0.0% 0 2150000 2150000 43
|
||||
string_trim 41.73 0.207 41.521 460028 0 0.0% 0 1560000 1560000 0
|
||||
try_catch_ok 57.60 0.226 57.379 1050023 0 0.0% 0 0 0 0
|
||||
try_catch_throw 51.63 0.289 51.346 580023 0 0.0% 0 720000 720000 0
|
||||
typeof_ops 284.89 0.226 284.660 4300023 0 0.0% 0 0 0 0
|
||||
unary_ops 271.73 0.318 271.415 3700023 0 0.0% 0 0 0 0
|
||||
arith_ops 300.00 0.415 299.588 4700023 0 0.0% 0 0 0 0
|
||||
array_filter 649.68 0.390 649.286 55739 0 99.9% 208001 28479960 28479960 3416
|
||||
array_for_each 680.13 0.389 679.740 35737 0 99.9% 204001 27887960 27887960 1184
|
||||
array_index_get 128.42 0.317 128.104 1817037 0 99.9% 1 38160 38160 8352
|
||||
array_index_set 99.04 0.459 98.580 1517035 0 99.9% 1 38160 38160 8352
|
||||
array_join 528.47 0.292 528.180 4140029 0 100.0% 20000 12580000 12580000 339
|
||||
array_literal 88.14 0.277 87.860 1500025 0 100.0% 50000 9200000 9200000 184
|
||||
array_map 631.64 0.342 631.297 55739 0 99.9% 208001 30079960 30079960 4568
|
||||
array_push_pop 1302.72 0.315 1302.406 10200029 0 100.0% 50000 28900000 28900000 552
|
||||
array_reduce 641.32 0.397 640.924 57739 0 99.9% 204001 27887960 27887960 2384
|
||||
array_slice 80.96 0.400 80.562 79739 0 99.9% 6001 13689960 13689960 4568
|
||||
array_sort 136.78 0.392 136.393 17939 0 99.7% 51501 9168960 9168960 4568
|
||||
branch_if 149.12 0.265 148.857 2816690 0 0.0% 0 0 0 0
|
||||
branch_switch 146.85 0.331 146.522 3000023 0 0.0% 0 0 0 0
|
||||
call_args 97.78 0.382 97.402 880029 0 0.0% 20002 2720307 2720307 715
|
||||
call_closure 68.18 0.380 67.797 500044 0 0.0% 20005 2720749 2720749 1461
|
||||
call_method 76.45 0.276 76.173 580032 0 50.0% 20003 2720443 2720443 907
|
||||
call_new_proto 140.64 0.319 140.319 800037 0 33.3% 60004 8160614 8160614 1694
|
||||
call_recursion 1099.77 0.312 1099.453 5527429 2 0.0% 147881 20112435 33554499 715
|
||||
call_this 127.80 0.362 127.435 780034 0 50.0% 40005 5440760 5440760 1632
|
||||
cmp_ops 440.02 0.251 439.772 5800025 0 0.0% 0 0 0 0
|
||||
code_forge 806.48 0.271 806.205 110018 0 0.0% 10000 1651670 1651670 0
|
||||
coercion_boolean 258.77 0.253 258.515 4450023 0 0.0% 0 0 0 0
|
||||
coercion_concat 198.97 0.413 198.552 2300025 0 0.0% 0 3888890 3888890 39
|
||||
coercion_nullish 357.27 0.354 356.913 5100032 0 50.0% 1 136 192 192
|
||||
coercion_tonumber 144.87 0.392 144.476 2600023 0 0.0% 0 0 0 0
|
||||
coercion_toprimitive 182.30 0.424 181.880 500025 0 0.0% 120000 17900000 17900000 1815
|
||||
coercion_tostring 392.12 0.346 391.769 4600025 0 0.0% 0 22200000 22200000 186
|
||||
gc_array 598.43 0.309 598.119 4390027 0 100.0% 5000 10300000 10300000 672
|
||||
gc_object 122.77 0.294 122.479 1550025 0 100.0% 50000 6800000 6800000 192
|
||||
gc_string 40.93 0.241 40.691 460025 0 0.0% 0 788890 788890 40
|
||||
gc_string_long 2088.95 0.234 2088.711 23000025 2 0.0% 0 7334531 33554441 41
|
||||
ic_cache 56.96 0.447 56.508 554039 0 78.9% 10001 1740160 2051232 2051232
|
||||
ic_polymorphic 234.59 0.387 234.205 4033387 0 100.0% 3 408 576 576
|
||||
loop_do_while 244.85 0.260 244.590 3000019 0 0.0% 0 0 0 0
|
||||
loop_for 1230.76 0.366 1230.393 16000023 0 0.0% 0 0 0 0
|
||||
loop_for_in 645.85 0.589 645.258 7591739 0 0.0% 1 3626 3626 1184
|
||||
loop_for_of 320.69 0.576 320.110 3652739 0 99.0% 6001 927960 927960 1184
|
||||
loop_for_of_string 245.23 0.418 244.811 2726339 0 0.0% 3000 466150 466150 132
|
||||
loop_index 424.71 0.471 424.236 6367739 0 100.0% 1 3960 3960 1184
|
||||
loop_while 1267.14 0.314 1266.828 16000023 0 0.0% 0 0 0 0
|
||||
loop_while_index 425.69 0.693 424.997 6667739 0 100.0% 1 3960 3960 1184
|
||||
map_ops 783.05 0.476 782.577 12650027 0 100.0% 100000 17200000 17200000 816
|
||||
math_ops 466.85 0.456 466.398 6500023 0 0.0% 0 0 0 0
|
||||
mem_array_grow 386.97 0.287 386.680 3800024 0 0.0% 1 160 2097312 2097312
|
||||
mem_closure_chain 140.77 0.650 140.116 590034 0 0.0% 80000 12558890 12558890 10079778
|
||||
mem_cross_call_retain 261.00 0.521 260.477 1590032 0 25.0% 60004 11970749 11970749 8693357
|
||||
mem_map_retain 64.64 0.292 64.343 600021 0 100.0% 20002 4698124 7063172 7063172
|
||||
mem_object_graph 123.41 0.363 123.041 884727 0 0.0% 65536 8912936 8912936 6291984
|
||||
mem_set_retain 46.82 0.235 46.588 460021 0 100.0% 20002 3809234 5158474 5158474
|
||||
mem_string_accum 109.54 0.232 109.311 960020 0 0.0% 1 2744633 3268921 3268921
|
||||
mem_string_rope 2.37 0.236 2.137 16025 6 0.0% 0 124184000 124184000 124184000
|
||||
member_compound 309.91 0.412 309.496 4400076 0 100.0% 6 872 1152 1152
|
||||
object_keys 484.57 0.456 484.118 3740027 0 100.0% 20000 18360000 18360000 416
|
||||
prop_access 171.26 0.380 170.881 2800036 0 100.0% 1 136 192 192
|
||||
prop_bracket 160.98 0.423 160.559 2100036 0 100.0% 1 136 192 192
|
||||
prop_delete 55.56 0.427 55.130 480034 0 50.0% 1 136 192 192
|
||||
prop_dynamic 77.89 0.301 77.589 1100028 0 100.0% 1 136 192 192
|
||||
prop_nested 132.86 0.347 132.517 1550025 0 100.0% 150000 20400000 20400000 576
|
||||
prop_set 206.53 0.272 206.255 3200032 0 100.0% 1 136 192 192
|
||||
property 154.87 0.414 154.459 111035 0 0.0% 1 231916 231916 32928
|
||||
set_ops 683.32 0.399 682.919 9950027 0 90.9% 100000 17200000 17200000 320
|
||||
string_build 1809.32 0.451 1808.872 16560027 4 0.0% 0 6791197 33554520 122
|
||||
string_case 186.69 0.359 186.329 1600028 0 0.0% 0 7600000 7600000 0
|
||||
string_char 311.22 0.266 310.953 3800025 0 0.0% 0 0 0 0
|
||||
string_concat 176.82 0.378 176.445 1800031 0 0.0% 0 1900000 1900000 38
|
||||
string_indexof 85.99 0.241 85.752 1100028 0 0.0% 0 0 0 0
|
||||
string_replace 55.86 0.353 55.510 600030 0 0.0% 0 1320000 1320000 66
|
||||
string_replace_fn 776.00 0.451 775.546 64987 3 0.0% 210 17604583 33586009 12641
|
||||
string_split 104.25 0.340 103.908 540030 0 100.0% 20000 24520000 24520000 1226
|
||||
string_substring 126.26 0.342 125.919 1500030 0 0.0% 0 2150000 2150000 43
|
||||
string_trim 43.86 0.253 43.607 460028 0 0.0% 0 1560000 1560000 0
|
||||
try_catch_ok 58.22 0.255 57.961 1050023 0 0.0% 0 0 0 0
|
||||
try_catch_throw 53.50 0.319 53.183 580023 0 0.0% 20000 3440000 3440000 0
|
||||
typeof_ops 311.13 0.250 310.880 4300023 0 0.0% 100000 13600000 13600000 0
|
||||
unary_ops 284.57 0.314 284.253 3700023 0 0.0% 0 0 0 0
|
||||
|
||||
内存基准用例(mem_*):
|
||||
|
||||
@@ -87,7 +87,19 @@ unary_ops 271.73 0.318 271.415 370002
|
||||
mem_map_retain 原生盒边持有:Map 持 20000 组字符串键 + 对象值
|
||||
mem_set_retain 原生盒边持有:Set 持 20000 个对象(各带 payload 字符串)
|
||||
mem_string_rope 拼接 rope 链留存:重复二元拼接形成深 Cons 链(账目按逻辑长度计,数值高于实际足迹)
|
||||
口径:Peak B/Ret B 为 session 堆账目(对象头 + 堆数据 + 存活串/BigInt);JSON 的
|
||||
`epoch_objects`/`epoch_bytes` 为恒零锚字段(epoch 分配器退役后保留 schema 兼容),
|
||||
不计入字节账目。Peak B 为顶层指令边界采样的 session arena 高水位;单指令内瞬态
|
||||
不计。Ret B 为 workload 后强制完整 GC 的真存活集。
|
||||
口径:Peak B/Ret B 为 session 堆账目(对象头 + 堆数据 + 存活串);BigInt 不入
|
||||
该账目,由单 run 分配公式按表长单列。epoch arena 的临时驻留不计入字节账目
|
||||
(数量列恒零)。Peak B 为顶层指令边界采样的 session 堆账目高水位;单指令内瞬态
|
||||
与 epoch 高水位不计。Ret B 为 workload 后晋升 + 完整 GC 的真存活集,至多含一份
|
||||
引擎内部副本:逃逸屏障留 epoch 原件且顶层寄存器根不回写时,测量时晋升会把原件
|
||||
再克隆一份(object_graph 见留存锚测试)。
|
||||
|
||||
A/B 判据口径:
|
||||
|
||||
主判(回归门):确定性列——指令数、内存账目(session/peak/retained)、
|
||||
垃圾回收计数、内联缓存计数——跨运行逐字节一致,零容差,双向任何变化即信号;
|
||||
基线对比的退出码 1 只认这些列。
|
||||
次判(墙时间):wall/exec/compile/gc_collection 列在 ±5% 带内(固定核、
|
||||
warmup 2、三轮中位);基线对比容差 0.50,信息性,不影响退出码。
|
||||
基线文件是陈旧锚(安静树单次快照),不是 A/B 仪器;A/B 是同机同宿主
|
||||
严格交错对比。
|
||||
|
||||
Generated
+18
-18
@@ -1095,7 +1095,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_builtins"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"fast-float",
|
||||
@@ -1120,7 +1120,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_bytecode"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"oxide_log",
|
||||
@@ -1128,7 +1128,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_cfg"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_emit",
|
||||
@@ -1139,7 +1139,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_cli"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"bumpalo",
|
||||
@@ -1159,7 +1159,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_code_cache"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"lru",
|
||||
"oxide_bytecode",
|
||||
@@ -1168,7 +1168,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_compiler"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1187,7 +1187,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_dce"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1201,7 +1201,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_emit"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"oxc_allocator",
|
||||
@@ -1216,7 +1216,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_ir"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_log",
|
||||
@@ -1225,7 +1225,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_kernel"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"dashmap",
|
||||
@@ -1240,7 +1240,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_liveness"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1252,7 +1252,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_log"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"tracing",
|
||||
"tracing-appender",
|
||||
@@ -1261,7 +1261,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_parser"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxc_allocator",
|
||||
"oxc_ast",
|
||||
@@ -1276,7 +1276,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_regalloc"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1292,7 +1292,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_runtime_api"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-traits",
|
||||
@@ -1304,7 +1304,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_test262"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_compiler",
|
||||
@@ -1321,7 +1321,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_types"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"hashbrown 0.14.5",
|
||||
@@ -1333,7 +1333,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_vm"
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"chrono",
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ members = [
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.5.0"
|
||||
version = "0.6.1"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
rust-version = "1.80"
|
||||
|
||||
+501
-501
File diff suppressed because it is too large
Load Diff
@@ -12,7 +12,10 @@ impl Baseline {
|
||||
}
|
||||
}
|
||||
|
||||
/// 一次性能回退:当前指标相对基线的比值超过容差即视为回归。
|
||||
/// 一次性能回退信号:当前指标相对基线的比值超过容差即报出。
|
||||
///
|
||||
/// `informational` 标记信息性信号(墙时型列):随表格打印供人工参考,
|
||||
/// 不影响退出码;非信息性信号是回归门,出现即退出码 1。
|
||||
pub struct Regression {
|
||||
pub metric: String,
|
||||
pub test_name: String,
|
||||
@@ -20,6 +23,7 @@ pub struct Regression {
|
||||
pub current: f64,
|
||||
pub ratio: f64,
|
||||
pub tolerance: f64,
|
||||
pub informational: bool,
|
||||
}
|
||||
|
||||
/// 从 `benchmark_baseline.json` 加载基线;文件不存在时返回空基线。
|
||||
@@ -47,8 +51,13 @@ pub fn save_baseline(results: &[MetricCollection]) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 对比当前结果与基线,返回所有超过各自容差(wall_time 10%、GC 类 50%、其它 20%)的回归项。
|
||||
/// 方向语义:`ic_hit_rate` 越高越好(下降超容差才报回归),其余指标越低越好(上升超容差报回归)。
|
||||
/// 对比当前结果与基线,返回所有超过各自容差的信号项。
|
||||
///
|
||||
/// 列语义分三档:确定性列(指令数、内存账目、垃圾回收计数、内联缓存计数)
|
||||
/// 跨运行逐字节一致,零容差,双向任何变化即信号;墙时型列(wall、exec、
|
||||
/// compile、gc_collection)容差 0.50,信息性,只打印不进退出码;
|
||||
/// `ic_hit_rate` 越高越好(下降超容差才报),其余列越低越好(上升超容差报)。
|
||||
/// 两侧零值跳过(基线为 0、当前非零的新分配场景由重锚吸收,不在此报)。
|
||||
pub fn compare_baseline(current: &[MetricCollection]) -> Vec<Regression> {
|
||||
let baseline = match load_baseline() {
|
||||
Ok(b) => b,
|
||||
@@ -77,14 +86,20 @@ pub fn compare_baseline(current: &[MetricCollection]) -> Vec<Regression> {
|
||||
if base_val == 0.0 {
|
||||
continue;
|
||||
}
|
||||
let tolerance = match name {
|
||||
"wall_time_us" => 0.10,
|
||||
"gc_trigger_count" | "gc_bytes_freed" | "gc_objects_scanned" | "gc_collection_us" => 0.50,
|
||||
"session_bytes" | "peak_bytes" | "retained_bytes" | "retained_objects" => 0.20,
|
||||
_ => 0.20,
|
||||
// 确定性列零容差(双向任何变化即信号);墙时型列信息性;
|
||||
// ic_hit_rate 越高越好;其余列保留 20% 默认带。
|
||||
let (tolerance, informational) = match name {
|
||||
"instruction_count" | "session_objects" | "session_bytes" | "gc_trigger_count"
|
||||
| "gc_bytes_freed" | "gc_objects_scanned" | "ic_hits" | "ic_misses" | "peak_bytes"
|
||||
| "retained_bytes" | "retained_objects" => (0.0, false),
|
||||
"wall_time_us" | "exec_time_us" | "compile_time_us" | "gc_collection_us" => (0.50, true),
|
||||
"ic_hit_rate" => (0.05, false),
|
||||
_ => (0.20, false),
|
||||
};
|
||||
let ratio = cur_val / base_val;
|
||||
let regressed = if matches!(name, "ic_hit_rate") {
|
||||
let regressed = if tolerance == 0.0 {
|
||||
(ratio - 1.0).abs() > 1e-9
|
||||
} else if matches!(name, "ic_hit_rate") {
|
||||
ratio < 1.0 - tolerance
|
||||
} else {
|
||||
ratio > 1.0 + tolerance
|
||||
@@ -97,6 +112,7 @@ pub fn compare_baseline(current: &[MetricCollection]) -> Vec<Regression> {
|
||||
current: cur_val,
|
||||
ratio,
|
||||
tolerance,
|
||||
informational,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,9 +155,27 @@ pub fn run_js_stress_bench(config: &BenchConfig, kernel: &Arc<KernelCore>, pool:
|
||||
eprintln!("Baseline saved to BENCHMARK_BASELINE.md + benchmark_baseline.json");
|
||||
} else {
|
||||
let regressions = compare_baseline(&results);
|
||||
if !regressions.is_empty() {
|
||||
// 信息性旗标(墙时型列)只打印供人工参考,不影响退出码。
|
||||
let informational: Vec<_> = regressions.iter().filter(|r| r.informational).collect();
|
||||
if !informational.is_empty() {
|
||||
eprintln!("\nWall-time drift (informational, does not affect exit code):");
|
||||
for r in &informational {
|
||||
eprintln!(
|
||||
" {}: {} baseline={} current={} ratio={:.2}% tolerance={:.0}%",
|
||||
r.test_name,
|
||||
r.metric,
|
||||
r.baseline,
|
||||
r.current,
|
||||
(r.ratio - 1.0) * 100.0,
|
||||
r.tolerance * 100.0,
|
||||
);
|
||||
}
|
||||
}
|
||||
// 回归门:确定性列等硬信号出现即退出码 1。
|
||||
let hard: Vec<_> = regressions.iter().filter(|r| !r.informational).collect();
|
||||
if !hard.is_empty() {
|
||||
eprintln!("\nRegression detected:");
|
||||
for r in ®ressions {
|
||||
for r in &hard {
|
||||
eprintln!(
|
||||
" {}: {} baseline={} current={} ratio={:.2}% tolerance={:.0}%",
|
||||
r.test_name,
|
||||
|
||||
@@ -23,6 +23,17 @@ const MEMORY_BENCH_NOTES: &str = "\n内存基准用例(mem_*):\n
|
||||
再克隆一份(object_graph 见留存锚测试)。
|
||||
";
|
||||
|
||||
/// A/B 判据口径说明,随表格尾部输出。
|
||||
const BENCH_JUDGMENT_NOTES: &str = "\nA/B 判据口径:\n
|
||||
主判(回归门):确定性列——指令数、内存账目(session/peak/retained)、
|
||||
垃圾回收计数、内联缓存计数——跨运行逐字节一致,零容差,双向任何变化即信号;
|
||||
基线对比的退出码 1 只认这些列。
|
||||
次判(墙时间):wall/exec/compile/gc_collection 列在 ±5% 带内(固定核、
|
||||
warmup 2、三轮中位);基线对比容差 0.50,信息性,不影响退出码。
|
||||
基线文件是陈旧锚(安静树单次快照),不是 A/B 仪器;A/B 是同机同宿主
|
||||
严格交错对比。
|
||||
";
|
||||
|
||||
/// 把结果格式化为对齐的文本表格(供终端打印)。
|
||||
///
|
||||
/// `Sess B`/`Peak B`/`Ret B` 为 session 堆账目(字节):执行期累计 / 峰值高水位 /
|
||||
@@ -64,6 +75,7 @@ pub fn format_text_table(results: &[MetricCollection]) -> String {
|
||||
out.push('\n');
|
||||
}
|
||||
out.push_str(MEMORY_BENCH_NOTES);
|
||||
out.push_str(BENCH_JUDGMENT_NOTES);
|
||||
out
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user