diff --git a/BENCHMARK_BASELINE.md b/BENCHMARK_BASELINE.md index 8cc31336..222d7998 100644 --- a/BENCHMARK_BASELINE.md +++ b/BENCHMARK_BASELINE.md @@ -1,68 +1,92 @@ -Test Name Wall(ms) Comp(ms) Exec(ms) Instrs GC Ct IC Rate Sess Objs Sess B ------------------------------------------------------------------------------------------------------------------------- -arith_ops 23.65 0.000 23.652 3000019 0 0.0% 0 0 -array_filter 232.56 0.000 232.558 41231 0 0.0% 2001 380120 -array_for_each 248.79 0.000 248.791 25231 0 0.0% 1 140120 -array_index_get 8.60 0.000 8.602 1012031 0 0.0% 1 120 -array_index_set 12.24 0.000 12.243 1012029 0 0.0% 1 120 -array_join 165.75 0.000 165.750 3040019 0 0.0% 20000 4180000 -array_literal 51.09 0.000 51.094 1150019 0 0.0% 50000 6000000 -array_map 224.96 0.000 224.960 41231 0 0.0% 2001 380120 -array_push_pop 321.18 0.000 321.182 7450019 0 0.0% 50000 6000000 -array_reduce 254.39 0.000 254.386 43231 0 0.0% 1 140120 -array_slice 73.67 0.000 73.674 58231 0 0.0% 3001 20928120 -array_sort 71.47 0.000 71.468 13931 0 0.0% 501 3504120 -branch_if 10.45 0.000 10.445 1866686 0 0.0% 0 0 -branch_switch 10.60 0.000 10.604 1875019 0 0.0% 0 0 -call_args 36.06 0.000 36.064 760023 0 0.0% 2 275 -call_closure 24.28 0.000 24.282 340035 0 0.0% 4 549 -call_method 29.61 0.000 29.605 420027 0 100.0% 3 395 -call_new_proto 71.14 0.000 71.140 660029 0 37.2% 100002 12000310 -call_recursion 348.35 0.000 348.354 5525823 0 25.0% 2 275 -call_this 46.73 0.000 46.729 620029 0 37.9% 5 680 -cmp_ops 29.79 0.000 29.792 3600019 0 42.9% 0 0 -code_forge 0.01 0.000 0.005 3600019 0 42.9% 0 329 -coercion_boolean 15.92 0.000 15.923 3050019 0 42.9% 0 0 -coercion_concat 41.84 0.000 41.837 1600019 0 42.9% 0 3888890 -coercion_nullish 66.91 0.000 66.911 3650025 0 59.9% 1 120 -coercion_tonumber 14.94 0.000 14.935 2100019 0 66.7% 0 0 -coercion_toprimitive 88.44 0.000 88.442 360019 0 66.7% 100000 13580000 -coercion_tostring 123.01 0.000 123.014 4200019 0 66.7% 0 34200000 -gc_array 137.04 0.000 137.036 3110019 0 66.7% 5000 600000 -gc_object 25.42 0.000 25.418 1200019 0 73.4% 50000 6000000 -gc_string 6.89 0.000 6.885 320019 0 76.5% 0 788890 -ic_cache 14.22 0.000 14.216 412035 0 75.3% 1 120 -ic_polymorphic 74.38 0.000 74.383 3433378 0 60.9% 100003 12000360 -loop_do_while 6.60 0.000 6.604 1400015 0 55.7% 0 0 -loop_for 37.24 0.000 37.240 8000019 0 55.7% 0 0 -loop_for_in 146.11 0.000 146.112 4561231 0 55.7% 1 3610 -loop_for_of 345.58 0.000 345.577 2734231 0 55.7% 1 108120 -loop_for_of_string 222.06 0.000 222.054 2266931 0 55.7% 0 58150 -loop_index 231.48 0.000 231.478 3649231 0 55.7% 1 120 -loop_while 33.83 0.000 33.831 8000019 0 55.7% 0 0 -loop_while_index 217.07 0.000 217.073 3649231 0 55.7% 1 120 -map_ops 298.46 0.000 298.455 9850019 0 55.7% 0 0 -math_ops 101.06 0.000 101.063 4800019 0 55.7% 0 0 -object_keys 204.96 0.000 204.959 2680019 0 55.7% 10000 15000000 -prop_access 11.71 0.000 11.715 2200031 0 67.6% 1 120 -prop_bracket 12.05 0.000 12.047 1400029 0 74.0% 1 120 -prop_delete 22.46 0.000 22.462 320029 0 74.4% 1 120 -prop_dynamic 3.22 0.000 3.221 700023 0 75.3% 1 120 -prop_nested 45.30 0.000 45.296 1200019 0 77.7% 150000 18000000 -prop_set 28.20 0.000 28.204 2400027 0 78.0% 1 120 -property 87.66 0.000 87.663 72031 0 77.8% 1 231900 -set_ops 283.31 0.000 283.314 7150019 0 77.8% 0 0 -string_build 168.54 0.000 168.541 8440019 0 77.8% 0 73900000 -string_case 44.80 0.000 44.799 1200023 0 77.8% 0 7600000 -string_char 75.01 0.000 75.014 2800019 0 77.8% 0 0 -string_concat 36.82 0.000 36.817 1800019 0 77.8% 0 9000000 -string_indexof 18.26 0.000 18.258 700023 0 77.8% 0 0 -string_replace 13.25 0.000 13.248 460023 0 77.8% 0 1320000 -string_replace_fn 122.85 0.000 122.849 50631 0 77.8% 0 4051150 -string_split 74.43 0.000 74.426 400023 0 77.8% 20000 19560000 -string_substring 38.86 0.000 38.860 1150023 0 77.8% 0 2150000 -string_trim 12.50 0.000 12.502 300023 0 77.8% 0 1560000 -try_catch_ok 2.12 0.000 2.116 550019 0 77.8% 0 0 -try_catch_throw 21.15 0.000 21.148 400019 0 77.9% 0 720000 -typeof_ops 88.37 0.000 88.370 2600019 0 78.0% 0 15200000 -unary_ops 11.52 0.000 11.517 2000019 0 78.0% 0 0 +Test Name Wall(ms) Comp(ms) Exec(ms) Instrs GC Ct IC Rate Sess Objs Sess B Peak B Ret B +------------------------------------------------------------------------------------------------------------------------------------------------------ +arith_ops 47.27 0.000 47.271 3000026 0 0.0% 0 0 0 0 +array_filter 405.68 0.001 405.674 41244 0 51.2% 6001 1228144 1228144 2176 +array_for_each 374.59 0.001 374.588 25244 0 62.7% 4001 140144 140144 1088 +array_index_get 9.84 0.000 9.835 1012042 0 70.6% 1 144 8288 8288 +array_index_set 9.38 0.000 9.376 1012038 0 74.3% 1 144 8288 8288 +array_join 113.52 0.001 113.520 3040032 0 98.4% 20000 4660000 4660000 419 +array_literal 84.01 0.000 84.007 1150028 0 87.4% 50000 8400000 8400000 336 +array_map 386.85 0.001 386.846 41244 0 81.4% 6001 2028144 2028144 2976 +array_push_pop 215.52 0.001 215.517 7450032 0 91.3% 50000 7200000 7200000 360 +array_reduce 417.76 0.001 417.759 43244 0 93.7% 4001 140144 140144 1584 +array_slice 85.12 0.001 85.122 58244 0 93.8% 3001 30672144 30672144 7824 +array_sort 108.11 0.000 108.110 13944 0 93.8% 1501 5128144 5128144 7824 +branch_if 22.25 0.000 22.249 1866693 0 93.8% 0 0 0 0 +branch_switch 21.67 0.000 21.674 1875026 0 93.8% 0 0 0 0 +call_args 51.47 0.001 51.465 720030 0 93.8% 2 35 499 499 +call_closure 24.62 0.000 24.622 340046 0 93.8% 4 69 997 997 +call_method 32.01 0.000 32.014 420036 0 92.5% 3 195 819 819 +call_new_proto 83.91 0.000 83.910 660038 0 89.4% 20004 3040070 3040070 1334 +call_recursion 522.22 0.001 522.221 5525830 0 88.0% 2 35 499 499 +call_this 63.87 0.001 63.866 620038 0 86.1% 5 248 1344 1344 +cmp_ops 70.09 0.000 70.095 3600028 0 85.0% 0 0 0 0 +code_forge 804.26 0.000 804.263 85020 0 85.0% 10000 291670 291670 0 +coercion_boolean 36.78 0.000 36.776 3050026 0 85.0% 0 0 0 0 +coercion_concat 55.45 0.000 55.452 1600028 0 85.0% 0 3888890 3888890 39 +coercion_nullish 109.39 0.000 109.392 3650036 0 81.3% 1 152 304 304 +coercion_tonumber 29.99 0.000 29.989 1800026 0 79.3% 0 0 0 0 +coercion_toprimitive 111.99 0.001 111.990 360028 0 79.3% 100000 4780000 4780000 1327 +coercion_tostring 166.51 0.000 166.509 3900028 0 79.3% 0 22200000 22200000 186 +gc_array 77.05 0.000 77.048 3110030 0 81.4% 5000 720000 720000 688 +gc_object 61.56 0.000 61.563 1200028 0 83.2% 50000 8000000 8000000 160 +gc_string 10.66 0.000 10.660 320028 0 83.6% 0 788890 788890 40 +gc_string_long 595.93 0.000 595.930 16000028 1 83.6% 0 7334531 33554441 41 +ic_cache 12.00 0.000 12.002 412044 0 83.6% 1 144 1642960 1642960 +ic_polymorphic 93.71 0.000 93.711 3333393 0 85.3% 100003 16800504 16800504 1176 +loop_do_while 12.68 0.000 12.678 1400022 0 86.2% 0 0 0 0 +loop_for 69.38 0.000 69.379 8000026 0 86.2% 0 0 0 0 +loop_for_in 183.54 0.000 183.538 4561244 0 86.2% 1 3610 3610 1064 +loop_for_of 412.69 0.000 412.684 2734244 0 86.2% 1 108144 108144 1088 +loop_for_of_string 256.13 0.000 256.129 2266944 0 86.2% 0 58150 58150 132 +loop_index 314.94 0.000 314.940 3649244 0 78.4% 1 144 1088 1088 +loop_while 69.48 0.000 69.484 8000026 0 74.3% 0 0 0 0 +loop_while_index 314.96 0.000 314.961 3649244 0 68.5% 1 144 1088 1088 +map_ops 232.57 0.001 232.570 9850030 0 69.4% 50000 9600000 9600000 544 +math_ops 130.99 0.000 130.987 4800026 0 71.6% 0 0 0 0 +mem_array_grow 200.91 0.000 200.915 2800026 0 71.6% 1 144 8288 8288 +mem_closure_chain 86.90 0.000 86.901 480040 0 71.6% 40000 1278890 8799386 8799386 +mem_cross_call_retain 159.32 0.001 159.322 1380034 0 70.4% 4 2670485 7951253 7951253 +mem_map_retain 42.20 0.001 42.194 500023 0 69.9% 1 1977972 4609319 4609319 +mem_object_graph 111.83 0.001 111.828 884726 0 70.0% 32769 5504888 11010200 11010200 +mem_set_retain 32.60 0.001 32.603 360023 0 70.1% 1 1089082 4449274 4449274 +mem_string_accum 69.16 0.000 69.162 760022 0 70.2% 1 2744617 3064761 3064761 +mem_string_rope 0.55 0.000 0.547 10028 1 70.2% 0 62108000 62108000 62108000 +member_compound 488.16 0.000 488.157 3200082 0 71.8% 100006 16000968 16000968 2104 +object_keys 313.98 0.001 313.981 2680030 0 72.6% 10000 15000000 15000000 424 +prop_access 21.34 0.000 21.341 2000040 0 74.3% 1 176 352 352 +prop_bracket 29.50 0.000 29.496 1400040 0 75.7% 1 168 336 336 +prop_delete 22.46 0.000 22.465 320038 0 75.8% 1 168 336 336 +prop_dynamic 6.19 0.000 6.190 700032 0 76.0% 1 120 272 272 +prop_nested 261.03 0.001 261.030 1200028 0 76.8% 150000 22800000 22800000 912 +prop_set 31.92 0.000 31.922 2400036 0 78.3% 1 160 320 320 +property 154.55 0.001 154.547 72040 0 79.0% 1 231900 231900 24264 +set_ops 372.45 0.001 372.447 7150030 0 79.8% 50000 9600000 9600000 464 +string_build 458.30 0.000 458.295 8440030 2 80.3% 0 6791158 33554485 122 +string_case 69.83 0.000 69.830 1200032 0 80.3% 0 7600000 7600000 0 +string_char 99.59 0.000 99.591 2800028 0 80.3% 0 0 0 0 +string_concat 70.02 0.000 70.020 1600034 0 80.3% 0 1900000 1900000 38 +string_indexof 24.26 0.000 24.255 700032 0 80.3% 0 0 0 0 +string_replace 19.15 0.000 19.149 460034 0 80.3% 0 1320000 1320000 66 +string_replace_fn 238.27 0.001 238.267 50592 0 80.3% 4000 4049360 4049360 7177 +string_split 133.50 0.000 133.495 400034 0 80.1% 20000 24200000 24200000 1562 +string_substring 43.37 0.000 43.367 1150034 0 80.0% 0 2150000 2150000 43 +string_trim 11.91 0.000 11.906 300032 0 80.0% 0 1560000 1560000 0 +try_catch_ok 4.35 0.000 4.348 550026 0 80.0% 0 0 0 0 +try_catch_throw 26.10 0.000 26.101 400026 0 80.0% 0 720000 720000 0 +typeof_ops 51.55 0.000 51.544 2600026 0 80.0% 0 0 0 0 +unary_ops 25.55 0.000 25.555 2000026 0 80.0% 0 0 0 0 + +内存基准用例(mem_*): + + mem_object_graph 大型对象图留存:15 层满二叉树 32767 节点整体驻留 session 堆 + mem_string_accum 字符串累积留存:40000 个互不相同的字符串驻留数组(interner 压力) + mem_closure_chain 闭包/upvalue 长链:10000 层闭包各自捕获前层闭包与 payload 驻留 + mem_array_grow 数组增缩容量:扩到 200000 元素后截回 1000,观测元素向量容量是否回落(账目按 Vec capacity 计) + mem_cross_call_retain 跨调用长存活数据:全局 store 经 30000 次调用累积 30000 条记录 + mem_map_retain 原生盒边持有:Map 持 20000 组字符串键 + 对象值 + mem_set_retain 原生盒边持有:Set 持 20000 个对象(各带 payload 字符串) + mem_string_rope 拼接 rope 链留存:重复二元拼接形成深 Cons 链(账目按逻辑长度计,数值高于实际足迹) +口径:Peak B/Ret B 为 session 堆账目(对象头 + 堆数据 + 存活串/BigInt);epoch arena +的临时驻留无字节账目(既有口径,数量见 JSON 的 epoch_objects)。Ret B 为 workload 后 +晋升 + 完整 GC 的真存活集。 diff --git a/benchmark_baseline.json b/benchmark_baseline.json index 53901f38..cba93e2a 100644 --- a/benchmark_baseline.json +++ b/benchmark_baseline.json @@ -1,7 +1,7 @@ [ { "test_name": "arith_ops", - "wall_time_us": 23653, + "wall_time_us": 47271, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -10,214 +10,250 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3000019, + "instruction_count": 3000026, "compile_time_us": 0, - "exec_time_us": 23652, + "exec_time_us": 47271, "ic_hit_rate": 0.0, "ic_hits": 0, - "ic_misses": 0 + "ic_misses": 0, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "array_filter", - "wall_time_us": 232559, - "session_objects": 2001, - "session_bytes": 380120, - "epoch_objects": 206001, + "wall_time_us": 405676, + "session_objects": 6001, + "session_bytes": 1228144, + "epoch_objects": 202001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 41231, - "compile_time_us": 0, - "exec_time_us": 232558, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 41244, + "compile_time_us": 1, + "exec_time_us": 405674, + "ic_hit_rate": 0.5117073170731707, + "ic_hits": 15735, + "ic_misses": 15015, + "peak_bytes": 1228144, + "retained_bytes": 2176, + "retained_objects": 4 }, { "test_name": "array_for_each", - "wall_time_us": 248791, - "session_objects": 1, - "session_bytes": 140120, - "epoch_objects": 204001, + "wall_time_us": 374590, + "session_objects": 4001, + "session_bytes": 140144, + "epoch_objects": 200001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 25231, - "compile_time_us": 0, - "exec_time_us": 248791, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 25244, + "compile_time_us": 1, + "exec_time_us": 374588, + "ic_hit_rate": 0.6266510221689638, + "ic_hits": 40911, + "ic_misses": 24039, + "peak_bytes": 140144, + "retained_bytes": 1088, + "retained_objects": 2 }, { "test_name": "array_index_get", - "wall_time_us": 8602, + "wall_time_us": 9835, "session_objects": 1, - "session_bytes": 120, + "session_bytes": 144, "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1012031, + "instruction_count": 1012042, "compile_time_us": 0, - "exec_time_us": 8602, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 9835, + "ic_hit_rate": 0.7059212355750606, + "ic_hits": 57844, + "ic_misses": 24055, + "peak_bytes": 8288, + "retained_bytes": 8288, + "retained_objects": 2 }, { "test_name": "array_index_set", - "wall_time_us": 12244, + "wall_time_us": 9376, "session_objects": 1, - "session_bytes": 120, + "session_bytes": 144, "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1012029, + "instruction_count": 1012038, "compile_time_us": 0, - "exec_time_us": 12243, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 9376, + "ic_hit_rate": 0.7434508123056516, + "ic_hits": 69832, + "ic_misses": 24067, + "peak_bytes": 8288, + "retained_bytes": 8288, + "retained_objects": 2 }, { "test_name": "array_join", - "wall_time_us": 165750, + "wall_time_us": 113521, "session_objects": 20000, - "session_bytes": 4180000, + "session_bytes": 4660000, "epoch_objects": 20000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3040019, - "compile_time_us": 0, - "exec_time_us": 165750, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 3040032, + "compile_time_us": 1, + "exec_time_us": 113520, + "ic_hit_rate": 0.9838463328497495, + "ic_hits": 1724313, + "ic_misses": 24087, + "peak_bytes": 4660000, + "retained_bytes": 419, + "retained_objects": 2 }, { "test_name": "array_literal", - "wall_time_us": 51094, + "wall_time_us": 84008, "session_objects": 50000, - "session_bytes": 6000000, + "session_bytes": 8400000, "epoch_objects": 50000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1150019, + "instruction_count": 1150028, "compile_time_us": 0, - "exec_time_us": 51094, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 84007, + "ic_hit_rate": 0.8736755078631179, + "ic_hits": 2714304, + "ic_misses": 399096, + "peak_bytes": 8400000, + "retained_bytes": 336, + "retained_objects": 2 }, { "test_name": "array_map", - "wall_time_us": 224961, - "session_objects": 2001, - "session_bytes": 380120, - "epoch_objects": 206001, + "wall_time_us": 386848, + "session_objects": 6001, + "session_bytes": 2028144, + "epoch_objects": 202001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 41231, - "compile_time_us": 0, - "exec_time_us": 224960, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 41244, + "compile_time_us": 1, + "exec_time_us": 386846, + "ic_hit_rate": 0.8139281165129137, + "ic_hits": 2730039, + "ic_misses": 624111, + "peak_bytes": 2028144, + "retained_bytes": 2976, + "retained_objects": 4 }, { "test_name": "array_push_pop", - "wall_time_us": 321183, + "wall_time_us": 215519, "session_objects": 50000, - "session_bytes": 6000000, + "session_bytes": 7200000, "epoch_objects": 50000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 7450019, - "compile_time_us": 0, - "exec_time_us": 321182, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 7450032, + "compile_time_us": 1, + "exec_time_us": 215517, + "ic_hit_rate": 0.9126231684709767, + "ic_hits": 6864465, + "ic_misses": 624135, + "peak_bytes": 7200000, + "retained_bytes": 360, + "retained_objects": 2 }, { "test_name": "array_reduce", - "wall_time_us": 254386, - "session_objects": 1, - "session_bytes": 140120, - "epoch_objects": 204001, + "wall_time_us": 417760, + "session_objects": 4001, + "session_bytes": 140144, + "epoch_objects": 200001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 43231, - "compile_time_us": 0, - "exec_time_us": 254386, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 43244, + "compile_time_us": 1, + "exec_time_us": 417759, + "ic_hit_rate": 0.9374549219585046, + "ic_hits": 9355191, + "ic_misses": 624159, + "peak_bytes": 140144, + "retained_bytes": 1584, + "retained_objects": 4 }, { "test_name": "array_slice", - "wall_time_us": 73674, + "wall_time_us": 85124, "session_objects": 3001, - "session_bytes": 20928120, + "session_bytes": 30672144, "epoch_objects": 6001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 58231, - "compile_time_us": 0, - "exec_time_us": 73674, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 58244, + "compile_time_us": 1, + "exec_time_us": 85122, + "ic_hit_rate": 0.9376567747295258, + "ic_hits": 9387867, + "ic_misses": 624183, + "peak_bytes": 30672144, + "retained_bytes": 7824, + "retained_objects": 4 }, { "test_name": "array_sort", - "wall_time_us": 71469, - "session_objects": 501, - "session_bytes": 3504120, - "epoch_objects": 51501, + "wall_time_us": 108111, + "session_objects": 1501, + "session_bytes": 5128144, + "epoch_objects": 50501, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 13931, + "instruction_count": 13944, "compile_time_us": 0, - "exec_time_us": 71468, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 108110, + "ic_hit_rate": 0.9377691024934561, + "ic_hits": 9406293, + "ic_misses": 624207, + "peak_bytes": 5128144, + "retained_bytes": 7824, + "retained_objects": 4 }, { "test_name": "branch_if", - "wall_time_us": 10445, + "wall_time_us": 22249, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -226,16 +262,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1866686, + "instruction_count": 1866693, "compile_time_us": 0, - "exec_time_us": 10445, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 22249, + "ic_hit_rate": 0.9377849539528764, + "ic_hits": 9408984, + "ic_misses": 624216, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "branch_switch", - "wall_time_us": 10604, + "wall_time_us": 21674, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -244,124 +283,145 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1875019, + "instruction_count": 1875026, "compile_time_us": 0, - "exec_time_us": 10604, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 21674, + "ic_hit_rate": 0.9377849539528764, + "ic_hits": 9408984, + "ic_misses": 624216, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "call_args", - "wall_time_us": 36064, + "wall_time_us": 51467, "session_objects": 2, - "session_bytes": 275, - "epoch_objects": 20002, + "session_bytes": 35, + "epoch_objects": 20000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 760023, - "compile_time_us": 0, - "exec_time_us": 36064, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "instruction_count": 720030, + "compile_time_us": 1, + "exec_time_us": 51465, + "ic_hit_rate": 0.9377849539528764, + "ic_hits": 9408984, + "ic_misses": 624216, + "peak_bytes": 499, + "retained_bytes": 499, + "retained_objects": 2 }, { "test_name": "call_closure", - "wall_time_us": 24282, + "wall_time_us": 24623, "session_objects": 4, - "session_bytes": 549, - "epoch_objects": 20005, + "session_bytes": 69, + "epoch_objects": 20001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 340035, + "instruction_count": 340046, "compile_time_us": 0, - "exec_time_us": 24282, - "ic_hit_rate": 0.0, - "ic_hits": 0, - "ic_misses": 0 + "exec_time_us": 24622, + "ic_hit_rate": 0.9377849539528764, + "ic_hits": 9408984, + "ic_misses": 624216, + "peak_bytes": 997, + "retained_bytes": 997, + "retained_objects": 4 }, { "test_name": "call_method", - "wall_time_us": 29605, + "wall_time_us": 32014, "session_objects": 3, - "session_bytes": 395, - "epoch_objects": 20002, + "session_bytes": 195, + "epoch_objects": 20001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 420027, + "instruction_count": 420036, "compile_time_us": 0, - "exec_time_us": 29605, - "ic_hit_rate": 1.0, - "ic_hits": 149992, - "ic_misses": 0 + "exec_time_us": 32014, + "ic_hit_rate": 0.9251267425547868, + "ic_hits": 9558976, + "ic_misses": 774223, + "peak_bytes": 819, + "retained_bytes": 819, + "retained_objects": 4 }, { "test_name": "call_new_proto", - "wall_time_us": 71140, - "session_objects": 100002, - "session_bytes": 12000310, - "epoch_objects": 60004, + "wall_time_us": 83911, + "session_objects": 20004, + "session_bytes": 3040070, + "epoch_objects": 60000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 660029, + "instruction_count": 660038, "compile_time_us": 0, - "exec_time_us": 71140, - "ic_hit_rate": 0.37228041911034826, - "ic_hits": 239988, - "ic_misses": 450000 + "exec_time_us": 83910, + "ic_hit_rate": 0.8939436993965197, + "ic_hits": 9798964, + "ic_misses": 1164235, + "peak_bytes": 3040070, + "retained_bytes": 1334, + "retained_objects": 6 }, { "test_name": "call_recursion", - "wall_time_us": 348354, + "wall_time_us": 522222, "session_objects": 2, - "session_bytes": 275, - "epoch_objects": 394602, + "session_bytes": 35, + "epoch_objects": 394600, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 5525823, - "compile_time_us": 0, - "exec_time_us": 348354, - "ic_hit_rate": 0.24999062488281104, - "ic_hits": 239988, - "ic_misses": 720000 + "instruction_count": 5525830, + "compile_time_us": 1, + "exec_time_us": 522221, + "ic_hit_rate": 0.8803332977246023, + "ic_hits": 9888960, + "ic_misses": 1344240, + "peak_bytes": 499, + "retained_bytes": 499, + "retained_objects": 2 }, { "test_name": "call_this", - "wall_time_us": 46730, + "wall_time_us": 63867, "session_objects": 5, - "session_bytes": 680, - "epoch_objects": 40004, + "session_bytes": 248, + "epoch_objects": 40001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 620029, - "compile_time_us": 0, - "exec_time_us": 46729, - "ic_hit_rate": 0.37861299340588866, - "ic_hits": 539973, - "ic_misses": 870000 + "instruction_count": 620038, + "compile_time_us": 1, + "exec_time_us": 63866, + "ic_hit_rate": 0.8611835507101396, + "ic_hits": 10188945, + "ic_misses": 1644255, + "peak_bytes": 1344, + "retained_bytes": 1344, + "retained_objects": 6 }, { "test_name": "cmp_ops", - "wall_time_us": 29792, + "wall_time_us": 70095, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -370,34 +430,40 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3600019, + "instruction_count": 3600028, "compile_time_us": 0, - "exec_time_us": 29792, - "ic_hit_rate": 0.428559183411073, - "ic_hits": 719964, - "ic_misses": 960000 + "exec_time_us": 70095, + "ic_hit_rate": 0.8503867729554175, + "ic_hits": 10368936, + "ic_misses": 1824264, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "code_forge", - "wall_time_us": 5, - "session_objects": 0, - "session_bytes": 329, + "wall_time_us": 804264, + "session_objects": 10000, + "session_bytes": 291670, "epoch_objects": 0, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3600019, + "instruction_count": 85020, "compile_time_us": 0, - "exec_time_us": 5, - "ic_hit_rate": 0.428559183411073, - "ic_hits": 719964, - "ic_misses": 960000 + "exec_time_us": 804263, + "ic_hit_rate": 0.8503867729554175, + "ic_hits": 10368936, + "ic_misses": 1824264, + "peak_bytes": 291670, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "coercion_boolean", - "wall_time_us": 15923, + "wall_time_us": 36776, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -406,16 +472,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3050019, + "instruction_count": 3050026, "compile_time_us": 0, - "exec_time_us": 15923, - "ic_hit_rate": 0.428559183411073, - "ic_hits": 719964, - "ic_misses": 960000 + "exec_time_us": 36776, + "ic_hit_rate": 0.8503867729554175, + "ic_hits": 10368936, + "ic_misses": 1824264, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "coercion_concat", - "wall_time_us": 41838, + "wall_time_us": 55452, "session_objects": 0, "session_bytes": 3888890, "epoch_objects": 0, @@ -424,34 +493,40 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1600019, + "instruction_count": 1600028, "compile_time_us": 0, - "exec_time_us": 41837, - "ic_hit_rate": 0.428559183411073, - "ic_hits": 719964, - "ic_misses": 960000 + "exec_time_us": 55452, + "ic_hit_rate": 0.8503867729554175, + "ic_hits": 10368936, + "ic_misses": 1824264, + "peak_bytes": 3888890, + "retained_bytes": 39, + "retained_objects": 0 }, { "test_name": "coercion_nullish", - "wall_time_us": 66911, + "wall_time_us": 109392, "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, + "session_bytes": 152, + "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3650025, + "instruction_count": 3650036, "compile_time_us": 0, - "exec_time_us": 66911, - "ic_hit_rate": 0.5992703624948206, - "ic_hits": 1469956, - "ic_misses": 960000 + "exec_time_us": 109392, + "ic_hit_rate": 0.8125545055633372, + "ic_hits": 11118928, + "ic_misses": 2574271, + "peak_bytes": 304, + "retained_bytes": 304, + "retained_objects": 2 }, { "test_name": "coercion_tonumber", - "wall_time_us": 14935, + "wall_time_us": 29989, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -460,88 +535,103 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2100019, + "instruction_count": 1800026, "compile_time_us": 0, - "exec_time_us": 14935, - "ic_hit_rate": 0.6666611110185169, - "ic_hits": 1919952, - "ic_misses": 960000 + "exec_time_us": 29989, + "ic_hit_rate": 0.7927612860784475, + "ic_hits": 11568924, + "ic_misses": 3024276, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "coercion_toprimitive", - "wall_time_us": 88442, + "wall_time_us": 111992, "session_objects": 100000, - "session_bytes": 13580000, - "epoch_objects": 100000, + "session_bytes": 4780000, + "epoch_objects": 40000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 360019, - "compile_time_us": 0, - "exec_time_us": 88442, - "ic_hit_rate": 0.6666611110185169, - "ic_hits": 1919952, - "ic_misses": 960000 + "instruction_count": 360028, + "compile_time_us": 1, + "exec_time_us": 111990, + "ic_hit_rate": 0.7927612860784475, + "ic_hits": 11568924, + "ic_misses": 3024276, + "peak_bytes": 4780000, + "retained_bytes": 1327, + "retained_objects": 6 }, { "test_name": "coercion_tostring", - "wall_time_us": 123014, + "wall_time_us": 166510, "session_objects": 0, - "session_bytes": 34200000, + "session_bytes": 22200000, "epoch_objects": 0, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 4200019, + "instruction_count": 3900028, "compile_time_us": 0, - "exec_time_us": 123014, - "ic_hit_rate": 0.6666611110185169, - "ic_hits": 1919952, - "ic_misses": 960000 + "exec_time_us": 166509, + "ic_hit_rate": 0.7927612860784475, + "ic_hits": 11568924, + "ic_misses": 3024276, + "peak_bytes": 22200000, + "retained_bytes": 186, + "retained_objects": 0 }, { "test_name": "gc_array", - "wall_time_us": 137036, + "wall_time_us": 77049, "session_objects": 5000, - "session_bytes": 600000, + "session_bytes": 720000, "epoch_objects": 5000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3110019, + "instruction_count": 3110030, "compile_time_us": 0, - "exec_time_us": 137036, - "ic_hit_rate": 0.6666611110185169, - "ic_hits": 1919952, - "ic_misses": 960000 + "exec_time_us": 77048, + "ic_hit_rate": 0.8141736514226585, + "ic_hits": 13443916, + "ic_misses": 3061783, + "peak_bytes": 720000, + "retained_bytes": 688, + "retained_objects": 2 }, { "test_name": "gc_object", - "wall_time_us": 25419, + "wall_time_us": 61564, "session_objects": 50000, - "session_bytes": 6000000, - "epoch_objects": 0, + "session_bytes": 8000000, + "epoch_objects": 50000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1200019, + "instruction_count": 1200028, "compile_time_us": 0, - "exec_time_us": 25418, - "ic_hit_rate": 0.7338581370793085, - "ic_hits": 2669937, - "ic_misses": 960000 + "exec_time_us": 61563, + "ic_hit_rate": 0.8323631458482389, + "ic_hits": 15318897, + "ic_misses": 3084303, + "peak_bytes": 8000000, + "retained_bytes": 160, + "retained_objects": 1 }, { "test_name": "gc_string", - "wall_time_us": 6886, + "wall_time_us": 10661, "session_objects": 0, "session_bytes": 788890, "epoch_objects": 0, @@ -550,124 +640,166 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 320019, + "instruction_count": 320028, "compile_time_us": 0, - "exec_time_us": 6885, - "ic_hit_rate": 0.76470173003053, - "ic_hits": 3119928, - "ic_misses": 960000 + "exec_time_us": 10660, + "ic_hit_rate": 0.8364037935204633, + "ic_hits": 15768888, + "ic_misses": 3084312, + "peak_bytes": 788890, + "retained_bytes": 40, + "retained_objects": 0 + }, + { + "test_name": "gc_string_long", + "wall_time_us": 595931, + "session_objects": 0, + "session_bytes": 7334531, + "epoch_objects": 0, + "epoch_bytes": 0, + "gc_trigger_count": 1, + "gc_bytes_freed": 33554359, + "gc_objects_scanned": 0, + "gc_collection_us": 64586, + "instruction_count": 16000028, + "compile_time_us": 0, + "exec_time_us": 595930, + "ic_hit_rate": 0.8364037935204633, + "ic_hits": 15768888, + "ic_misses": 3084312, + "peak_bytes": 33554441, + "retained_bytes": 41, + "retained_objects": 0 }, { "test_name": "ic_cache", - "wall_time_us": 14217, + "wall_time_us": 12003, "session_objects": 1, - "session_bytes": 120, + "session_bytes": 144, + "epoch_objects": 10001, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 412044, + "compile_time_us": 0, + "exec_time_us": 12002, + "ic_hit_rate": 0.8359340499176156, + "ic_hits": 15918850, + "ic_misses": 3124354, + "peak_bytes": 1642960, + "retained_bytes": 1642960, + "retained_objects": 10002 + }, + { + "test_name": "ic_polymorphic", + "wall_time_us": 93711, + "session_objects": 100003, + "session_bytes": 16800504, + "epoch_objects": 3, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 3333393, + "compile_time_us": 0, + "exec_time_us": 93711, + "ic_hit_rate": 0.8526889629141319, + "ic_hits": 18258805, + "ic_misses": 3148402, + "peak_bytes": 16800504, + "retained_bytes": 1176, + "retained_objects": 7 + }, + { + "test_name": "loop_do_while", + "wall_time_us": 12678, + "session_objects": 0, + "session_bytes": 0, + "epoch_objects": 0, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 1400022, + "compile_time_us": 0, + "exec_time_us": 12678, + "ic_hit_rate": 0.8616519214483604, + "ic_hits": 19608792, + "ic_misses": 3148416, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 + }, + { + "test_name": "loop_for", + "wall_time_us": 69380, + "session_objects": 0, + "session_bytes": 0, + "epoch_objects": 0, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 8000026, + "compile_time_us": 0, + "exec_time_us": 69379, + "ic_hit_rate": 0.8616519214483604, + "ic_hits": 19608792, + "ic_misses": 3148416, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 + }, + { + "test_name": "loop_for_in", + "wall_time_us": 183539, + "session_objects": 1, + "session_bytes": 3610, "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 412035, + "instruction_count": 4561244, "compile_time_us": 0, - "exec_time_us": 14216, - "ic_hit_rate": 0.7533162476377596, - "ic_hits": 3159918, - "ic_misses": 1035007 - }, - { - "test_name": "ic_polymorphic", - "wall_time_us": 74383, - "session_objects": 100003, - "session_bytes": 12000360, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 3433378, - "compile_time_us": 0, - "exec_time_us": 74383, - "ic_hit_rate": 0.6088101809829856, - "ic_hits": 3933904, - "ic_misses": 2580019 - }, - { - "test_name": "loop_do_while", - "wall_time_us": 6604, - "session_objects": 0, - "session_bytes": 0, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 1400015, - "compile_time_us": 0, - "exec_time_us": 6604, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "loop_for", - "wall_time_us": 37240, - "session_objects": 0, - "session_bytes": 0, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 8000019, - "compile_time_us": 0, - "exec_time_us": 37240, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "loop_for_in", - "wall_time_us": 146113, - "session_objects": 1, - "session_bytes": 3610, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 4561231, - "compile_time_us": 0, - "exec_time_us": 146112, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 + "exec_time_us": 183538, + "ic_hit_rate": 0.8616519214483604, + "ic_hits": 19608792, + "ic_misses": 3148416, + "peak_bytes": 3610, + "retained_bytes": 1064, + "retained_objects": 2 }, { "test_name": "loop_for_of", - "wall_time_us": 345578, + "wall_time_us": 412685, "session_objects": 1, - "session_bytes": 108120, + "session_bytes": 108144, "epoch_objects": 3001, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2734231, + "instruction_count": 2734244, "compile_time_us": 0, - "exec_time_us": 345577, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 + "exec_time_us": 412684, + "ic_hit_rate": 0.8616561512036686, + "ic_hits": 19609534, + "ic_misses": 3148423, + "peak_bytes": 108144, + "retained_bytes": 1088, + "retained_objects": 2 }, { "test_name": "loop_for_of_string", - "wall_time_us": 222055, + "wall_time_us": 256130, "session_objects": 0, "session_bytes": 58150, "epoch_objects": 1500, @@ -676,34 +808,40 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2266931, + "instruction_count": 2266944, "compile_time_us": 0, - "exec_time_us": 222054, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 + "exec_time_us": 256129, + "ic_hit_rate": 0.8616586889557476, + "ic_hits": 19609980, + "ic_misses": 3148428, + "peak_bytes": 58150, + "retained_bytes": 132, + "retained_objects": 0 }, { "test_name": "loop_index", - "wall_time_us": 231479, + "wall_time_us": 314940, "session_objects": 1, - "session_bytes": 120, + "session_bytes": 144, "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3649231, + "instruction_count": 3649244, "compile_time_us": 0, - "exec_time_us": 231478, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 + "exec_time_us": 314940, + "ic_hit_rate": 0.7843861187133511, + "ic_hits": 19610722, + "ic_misses": 5420935, + "peak_bytes": 1088, + "retained_bytes": 1088, + "retained_objects": 2 }, { "test_name": "loop_while", - "wall_time_us": 33831, + "wall_time_us": 69484, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -712,16 +850,355 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 8000019, + "instruction_count": 8000026, "compile_time_us": 0, - "exec_time_us": 33831, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 + "exec_time_us": 69484, + "ic_hit_rate": 0.742970876063927, + "ic_hits": 19611168, + "ic_misses": 6784440, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "loop_while_index", - "wall_time_us": 217073, + "wall_time_us": 314961, + "session_objects": 1, + "session_bytes": 144, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 3649244, + "compile_time_us": 0, + "exec_time_us": 314961, + "ic_hit_rate": 0.6847156866343282, + "ic_hits": 19611910, + "ic_misses": 9056947, + "peak_bytes": 1088, + "retained_bytes": 1088, + "retained_objects": 2 + }, + { + "test_name": "map_ops", + "wall_time_us": 232571, + "session_objects": 50000, + "session_bytes": 9600000, + "epoch_objects": 100000, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 9850030, + "compile_time_us": 1, + "exec_time_us": 232570, + "ic_hit_rate": 0.6942766186080745, + "ic_hits": 23737341, + "ic_misses": 10420467, + "peak_bytes": 9600000, + "retained_bytes": 544, + "retained_objects": 2 + }, + { + "test_name": "math_ops", + "wall_time_us": 130987, + "session_objects": 0, + "session_bytes": 0, + "epoch_objects": 0, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 4800026, + "compile_time_us": 0, + "exec_time_us": 130987, + "ic_hit_rate": 0.7155425267972905, + "ic_hits": 26212332, + "ic_misses": 10420476, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 + }, + { + "test_name": "mem_array_grow", + "wall_time_us": 200915, + "session_objects": 1, + "session_bytes": 144, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 2800026, + "compile_time_us": 0, + "exec_time_us": 200915, + "ic_hit_rate": 0.7155422338049308, + "ic_hits": 26212332, + "ic_misses": 10420491, + "peak_bytes": 8288, + "retained_bytes": 8288, + "retained_objects": 2 + }, + { + "test_name": "mem_closure_chain", + "wall_time_us": 86903, + "session_objects": 40000, + "session_bytes": 1278890, + "epoch_objects": 40000, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 480040, + "compile_time_us": 0, + "exec_time_us": 86901, + "ic_hit_rate": 0.7155420580096018, + "ic_hits": 26212332, + "ic_misses": 10420500, + "peak_bytes": 8799386, + "retained_bytes": 8799386, + "retained_objects": 40002 + }, + { + "test_name": "mem_cross_call_retain", + "wall_time_us": 159323, + "session_objects": 4, + "session_bytes": 2670485, + "epoch_objects": 60002, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 1380034, + "compile_time_us": 1, + "exec_time_us": 159322, + "ic_hit_rate": 0.7044168668585105, + "ic_hits": 26437332, + "ic_misses": 11095515, + "peak_bytes": 7951253, + "retained_bytes": 7951253, + "retained_objects": 30006 + }, + { + "test_name": "mem_map_retain", + "wall_time_us": 42196, + "session_objects": 1, + "session_bytes": 1977972, + "epoch_objects": 20002, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 500023, + "compile_time_us": 1, + "exec_time_us": 42194, + "ic_hit_rate": 0.6991181738419302, + "ic_hits": 26722324, + "ic_misses": 11500539, + "peak_bytes": 4609319, + "retained_bytes": 4609319, + "retained_objects": 20002 + }, + { + "test_name": "mem_object_graph", + "wall_time_us": 111829, + "session_objects": 32769, + "session_bytes": 5504888, + "epoch_objects": 65534, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 884726, + "compile_time_us": 1, + "exec_time_us": 111828, + "ic_hit_rate": 0.6998247627030993, + "ic_hits": 26812320, + "ic_misses": 11500585, + "peak_bytes": 11010200, + "retained_bytes": 11010200, + "retained_objects": 65536 + }, + { + "test_name": "mem_set_retain", + "wall_time_us": 32604, + "session_objects": 1, + "session_bytes": 1089082, + "epoch_objects": 20002, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 360023, + "compile_time_us": 1, + "exec_time_us": 32603, + "ic_hit_rate": 0.700993995951946, + "ic_hits": 26962312, + "ic_misses": 11500623, + "peak_bytes": 4449274, + "retained_bytes": 4449274, + "retained_objects": 20002 + }, + { + "test_name": "mem_string_accum", + "wall_time_us": 69164, + "session_objects": 1, + "session_bytes": 2744617, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 760022, + "compile_time_us": 0, + "exec_time_us": 69162, + "ic_hit_rate": 0.701692341422148, + "ic_hits": 27052308, + "ic_misses": 11500639, + "peak_bytes": 3064761, + "retained_bytes": 3064761, + "retained_objects": 2 + }, + { + "test_name": "mem_string_rope", + "wall_time_us": 547, + "session_objects": 0, + "session_bytes": 62108000, + "epoch_objects": 0, + "epoch_bytes": 0, + "gc_trigger_count": 1, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 67, + "instruction_count": 10028, + "compile_time_us": 0, + "exec_time_us": 547, + "ic_hit_rate": 0.7016922595188042, + "ic_hits": 27052308, + "ic_misses": 11500644, + "peak_bytes": 62108000, + "retained_bytes": 62108000, + "retained_objects": 0 + }, + { + "test_name": "member_compound", + "wall_time_us": 488158, + "session_objects": 100006, + "session_bytes": 16000968, + "epoch_objects": 6, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 3200082, + "compile_time_us": 0, + "exec_time_us": 488157, + "ic_hit_rate": 0.7180152007415, + "ic_hits": 29302278, + "ic_misses": 11500681, + "peak_bytes": 16000968, + "retained_bytes": 2104, + "retained_objects": 13 + }, + { + "test_name": "object_keys", + "wall_time_us": 313983, + "session_objects": 10000, + "session_bytes": 15000000, + "epoch_objects": 20000, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 2680030, + "compile_time_us": 1, + "exec_time_us": 313981, + "ic_hit_rate": 0.7258762032977852, + "ic_hits": 30652260, + "ic_misses": 11575704, + "peak_bytes": 15000000, + "retained_bytes": 424, + "retained_objects": 2 + }, + { + "test_name": "prop_access", + "wall_time_us": 21341, + "session_objects": 1, + "session_bytes": 176, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 2000040, + "compile_time_us": 0, + "exec_time_us": 21341, + "ic_hit_rate": 0.7431529729989134, + "ic_hits": 33652230, + "ic_misses": 11620734, + "peak_bytes": 352, + "retained_bytes": 352, + "retained_objects": 2 + }, + { + "test_name": "prop_bracket", + "wall_time_us": 29496, + "session_objects": 1, + "session_bytes": 168, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 1400040, + "compile_time_us": 0, + "exec_time_us": 29496, + "ic_hit_rate": 0.7569958502778709, + "ic_hits": 36202204, + "ic_misses": 11620759, + "peak_bytes": 336, + "retained_bytes": 336, + "retained_objects": 2 + }, + { + "test_name": "prop_delete", + "wall_time_us": 22465, + "session_objects": 1, + "session_bytes": 168, + "epoch_objects": 1, + "epoch_bytes": 0, + "gc_trigger_count": 0, + "gc_bytes_freed": 0, + "gc_objects_scanned": 0, + "gc_collection_us": 0, + "instruction_count": 320038, + "compile_time_us": 0, + "exec_time_us": 22465, + "ic_hit_rate": 0.7576696890560675, + "ic_hits": 36802192, + "ic_misses": 11770771, + "peak_bytes": 336, + "retained_bytes": 336, + "retained_objects": 2 + }, + { + "test_name": "prop_dynamic", + "wall_time_us": 6191, "session_objects": 1, "session_bytes": 120, "epoch_objects": 1, @@ -730,232 +1207,124 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 3649231, + "instruction_count": 700032, "compile_time_us": 0, - "exec_time_us": 217073, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "map_ops", - "wall_time_us": 298456, - "session_objects": 0, - "session_bytes": 0, - "epoch_objects": 100000, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 9850019, - "compile_time_us": 0, - "exec_time_us": 298455, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "math_ops", - "wall_time_us": 101063, - "session_objects": 0, - "session_bytes": 0, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 4800019, - "compile_time_us": 0, - "exec_time_us": 101063, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "object_keys", - "wall_time_us": 204960, - "session_objects": 10000, - "session_bytes": 15000000, - "epoch_objects": 10000, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 2680019, - "compile_time_us": 0, - "exec_time_us": 204959, - "ic_hit_rate": 0.5574697822613749, - "ic_hits": 4383900, - "ic_misses": 3480024 - }, - { - "test_name": "prop_access", - "wall_time_us": 11715, - "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 2200031, - "compile_time_us": 0, - "exec_time_us": 11715, - "ic_hit_rate": 0.6760152693220209, - "ic_hits": 7383870, - "ic_misses": 3480024 - }, - { - "test_name": "prop_bracket", - "wall_time_us": 12047, - "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 1400029, - "compile_time_us": 0, - "exec_time_us": 12047, - "ic_hit_rate": 0.7404461745408346, - "ic_hits": 9933844, - "ic_misses": 3480024 - }, - { - "test_name": "prop_delete", - "wall_time_us": 22462, - "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 320029, - "compile_time_us": 0, - "exec_time_us": 22462, - "ic_hit_rate": 0.7437278186807665, - "ic_hits": 10533832, - "ic_misses": 3630031 - }, - { - "test_name": "prop_dynamic", - "wall_time_us": 3222, - "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, - "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, - "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 700023, - "compile_time_us": 0, - "exec_time_us": 3221, - "ic_hit_rate": 0.7534495564455203, - "ic_hits": 11373813, - "ic_misses": 3720051 + "exec_time_us": 6190, + "ic_hit_rate": 0.7603943413176043, + "ic_hits": 37642173, + "ic_misses": 11860791, + "peak_bytes": 272, + "retained_bytes": 272, + "retained_objects": 2 }, { "test_name": "prop_nested", - "wall_time_us": 45297, + "wall_time_us": 261032, "session_objects": 150000, - "session_bytes": 18000000, - "epoch_objects": 0, + "session_bytes": 22800000, + "epoch_objects": 150000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1200019, - "compile_time_us": 0, - "exec_time_us": 45296, - "ic_hit_rate": 0.7766762534576178, - "ic_hits": 12948781, - "ic_misses": 3720060 + "instruction_count": 1200028, + "compile_time_us": 1, + "exec_time_us": 261030, + "ic_hit_rate": 0.7677733117828281, + "ic_hits": 39217141, + "ic_misses": 11860822, + "peak_bytes": 22800000, + "retained_bytes": 912, + "retained_objects": 6 }, { "test_name": "prop_set", - "wall_time_us": 28205, + "wall_time_us": 31922, "session_objects": 1, - "session_bytes": 120, - "epoch_objects": 0, + "session_bytes": 160, + "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2400027, + "instruction_count": 2400036, "compile_time_us": 0, - "exec_time_us": 28204, - "ic_hit_rate": 0.7803704129350366, - "ic_hits": 15873745, - "ic_misses": 4470082 + "exec_time_us": 31922, + "ic_hit_rate": 0.783279453051798, + "ic_hits": 42892098, + "ic_misses": 11860866, + "peak_bytes": 320, + "retained_bytes": 320, + "retained_objects": 2 }, { "test_name": "property", - "wall_time_us": 87664, + "wall_time_us": 154548, "session_objects": 1, "session_bytes": 231900, - "epoch_objects": 0, + "epoch_objects": 1, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 72031, - "compile_time_us": 0, - "exec_time_us": 87663, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "instruction_count": 72040, + "compile_time_us": 1, + "exec_time_us": 154547, + "ic_hit_rate": 0.7902694543118907, + "ic_hits": 44692080, + "ic_misses": 11860884, + "peak_bytes": 231900, + "retained_bytes": 24264, + "retained_objects": 2 }, { "test_name": "set_ops", - "wall_time_us": 283315, - "session_objects": 0, - "session_bytes": 0, + "wall_time_us": 372448, + "session_objects": 50000, + "session_bytes": 9600000, "epoch_objects": 100000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 7150019, - "compile_time_us": 0, - "exec_time_us": 283314, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "instruction_count": 7150030, + "compile_time_us": 1, + "exec_time_us": 372447, + "ic_hit_rate": 0.7982718783704015, + "ic_hits": 48442072, + "ic_misses": 12235891, + "peak_bytes": 9600000, + "retained_bytes": 464, + "retained_objects": 2 }, { "test_name": "string_build", - "wall_time_us": 168542, + "wall_time_us": 458297, "session_objects": 0, - "session_bytes": 73900000, + "session_bytes": 6791158, "epoch_objects": 0, "epoch_bytes": 0, - "gc_trigger_count": 0, - "gc_bytes_freed": 0, + "gc_trigger_count": 2, + "gc_bytes_freed": 67108842, "gc_objects_scanned": 0, - "gc_collection_us": 0, - "instruction_count": 8440019, + "gc_collection_us": 89548, + "instruction_count": 8440030, "compile_time_us": 0, - "exec_time_us": 168541, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 458295, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 33554485, + "retained_bytes": 122, + "retained_objects": 0 }, { "test_name": "string_case", - "wall_time_us": 44800, + "wall_time_us": 69831, "session_objects": 0, "session_bytes": 7600000, "epoch_objects": 0, @@ -964,16 +1333,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1200023, + "instruction_count": 1200032, "compile_time_us": 0, - "exec_time_us": 44799, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 69830, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 7600000, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "string_char", - "wall_time_us": 75014, + "wall_time_us": 99592, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -982,34 +1354,40 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2800019, + "instruction_count": 2800028, "compile_time_us": 0, - "exec_time_us": 75014, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 99591, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "string_concat", - "wall_time_us": 36818, + "wall_time_us": 70021, "session_objects": 0, - "session_bytes": 9000000, + "session_bytes": 1900000, "epoch_objects": 0, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1800019, + "instruction_count": 1600034, "compile_time_us": 0, - "exec_time_us": 36817, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 70020, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 1900000, + "retained_bytes": 38, + "retained_objects": 0 }, { "test_name": "string_indexof", - "wall_time_us": 18258, + "wall_time_us": 24256, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -1018,16 +1396,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 700023, + "instruction_count": 700032, "compile_time_us": 0, - "exec_time_us": 18258, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 24255, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "string_replace", - "wall_time_us": 13249, + "wall_time_us": 19150, "session_objects": 0, "session_bytes": 1320000, "epoch_objects": 0, @@ -1036,52 +1417,61 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 460023, + "instruction_count": 460034, "compile_time_us": 0, - "exec_time_us": 13248, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 19149, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 1320000, + "retained_bytes": 66, + "retained_objects": 0 }, { "test_name": "string_replace_fn", - "wall_time_us": 122849, - "session_objects": 0, - "session_bytes": 4051150, - "epoch_objects": 106000, + "wall_time_us": 238268, + "session_objects": 4000, + "session_bytes": 4049360, + "epoch_objects": 102000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 50631, - "compile_time_us": 0, - "exec_time_us": 122849, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "instruction_count": 50592, + "compile_time_us": 1, + "exec_time_us": 238267, + "ic_hit_rate": 0.8026870757800062, + "ic_hits": 50692068, + "ic_misses": 12460896, + "peak_bytes": 4049360, + "retained_bytes": 7177, + "retained_objects": 3 }, { "test_name": "string_split", - "wall_time_us": 74427, + "wall_time_us": 133496, "session_objects": 20000, - "session_bytes": 19560000, - "epoch_objects": 0, + "session_bytes": 24200000, + "epoch_objects": 20000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 400023, + "instruction_count": 400034, "compile_time_us": 0, - "exec_time_us": 74426, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 133495, + "ic_hit_rate": 0.8007857222166553, + "ic_hits": 50692068, + "ic_misses": 12610896, + "peak_bytes": 24200000, + "retained_bytes": 1562, + "retained_objects": 2 }, { "test_name": "string_substring", - "wall_time_us": 38860, + "wall_time_us": 43367, "session_objects": 0, "session_bytes": 2150000, "epoch_objects": 0, @@ -1090,16 +1480,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 1150023, + "instruction_count": 1150034, "compile_time_us": 0, - "exec_time_us": 38860, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 43367, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 2150000, + "retained_bytes": 43, + "retained_objects": 0 }, { "test_name": "string_trim", - "wall_time_us": 12502, + "wall_time_us": 11906, "session_objects": 0, "session_bytes": 1560000, "epoch_objects": 0, @@ -1108,16 +1501,19 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 300023, + "instruction_count": 300032, "compile_time_us": 0, - "exec_time_us": 12502, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 11906, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 1560000, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "try_catch_ok", - "wall_time_us": 2117, + "wall_time_us": 4348, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -1126,52 +1522,61 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 550019, + "instruction_count": 550026, "compile_time_us": 0, - "exec_time_us": 2116, - "ic_hit_rate": 0.7778118580039549, - "ic_hits": 17223732, - "ic_misses": 4920096 + "exec_time_us": 4348, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "try_catch_throw", - "wall_time_us": 21149, + "wall_time_us": 26101, "session_objects": 0, "session_bytes": 720000, - "epoch_objects": 20000, + "epoch_objects": 40000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 400019, + "instruction_count": 400026, "compile_time_us": 0, - "exec_time_us": 21148, - "ic_hit_rate": 0.7793052713950381, - "ic_hits": 17373724, - "ic_misses": 4920096 + "exec_time_us": 26101, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 720000, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "typeof_ops", - "wall_time_us": 88370, + "wall_time_us": 51545, "session_objects": 0, - "session_bytes": 15200000, - "epoch_objects": 0, + "session_bytes": 0, + "epoch_objects": 100000, "epoch_bytes": 0, "gc_trigger_count": 0, "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2600019, + "instruction_count": 2600026, "compile_time_us": 0, - "exec_time_us": 88370, - "ic_hit_rate": 0.7801940473420618, - "ic_hits": 17463720, - "ic_misses": 4920096 + "exec_time_us": 51544, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 }, { "test_name": "unary_ops", - "wall_time_us": 11517, + "wall_time_us": 25555, "session_objects": 0, "session_bytes": 0, "epoch_objects": 0, @@ -1180,11 +1585,14 @@ "gc_bytes_freed": 0, "gc_objects_scanned": 0, "gc_collection_us": 0, - "instruction_count": 2000019, + "instruction_count": 2000026, "compile_time_us": 0, - "exec_time_us": 11517, - "ic_hit_rate": 0.7801940473420618, - "ic_hits": 17463720, - "ic_misses": 4920096 + "exec_time_us": 25555, + "ic_hit_rate": 0.7996481754662866, + "ic_hits": 50692068, + "ic_misses": 12700896, + "peak_bytes": 0, + "retained_bytes": 0, + "retained_objects": 0 } ] \ No newline at end of file diff --git a/crates/oxide_cli/src/bench/baseline.rs b/crates/oxide_cli/src/bench/baseline.rs index 5abad7da..8a75eb3b 100644 --- a/crates/oxide_cli/src/bench/baseline.rs +++ b/crates/oxide_cli/src/bench/baseline.rs @@ -79,7 +79,7 @@ pub fn compare_baseline(current: &[MetricCollection]) -> Vec { 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" => 0.20, + "session_bytes" | "peak_bytes" | "retained_bytes" | "retained_objects" => 0.20, _ => 0.20, }; let ratio = cur_val / base_val; diff --git a/crates/oxide_cli/src/bench/js_stress.rs b/crates/oxide_cli/src/bench/js_stress.rs index ebe30657..e40c4d56 100644 --- a/crates/oxide_cli/src/bench/js_stress.rs +++ b/crates/oxide_cli/src/bench/js_stress.rs @@ -91,25 +91,53 @@ pub fn run_js_stress_bench(config: &BenchConfig, kernel: &Arc, pool: let _result = vm.run(&module); let exec_time = exec_start.elapsed(); + // 执行期指标须在强制 GC 前读取:GC 会搬移/清扫 session 对象, + // 其后读到的计数是存活集而非本执行期的累计量 let gc_stats = vm.session_gc_stats(); + let gc_trigger_count = gc_stats.total_collections; + let gc_bytes_freed = gc_stats.last_collection_bytes_freed; + let gc_objects_scanned = gc_stats.last_collection_objects_scanned; + let gc_collection_us = gc_stats.last_collection_duration_us; + let session_objects = vm.session_object_count().saturating_sub(pre_session); + let session_bytes = vm.session_bytes_allocated(); + let epoch_objects = vm.epoch_object_count().saturating_sub(pre_epoch); + let instruction_count = vm.instruction_count(); + let ic_hit_rate = vm.ic_hit_rate(); + let ic_hits = vm.ic_hit_count(); + let ic_misses = vm.ic_miss_count(); + + // 留存口径:先让存活集对 session 完全可见——根直接持有的 epoch 对象 + // (顶层 var 等)晋升进 session,session 对象持有的 epoch 子引用 + // (闭包捕获、原生盒直插)同样晋升(均与 epoch 边界同机制); + // 再强制完整 GC 清掉不可达垃圾,清扫后账目即 workload 留存堆 + vm.promote_rooted_epoch_objects(); + vm.promote_session_epoch_refs(); + vm.collect_session_gc(); + let retained_bytes = vm.session_bytes_allocated(); + let retained_objects = vm.session_object_count(); + // 峰值高水位取执行期采样与 GC 后存活字节的较大者(存活集亦属高水位) + let peak_bytes = vm.session_bytes_peak().max(retained_bytes); metrics.push(MetricCollection { test_name: test_name.clone(), wall_time_us: (compile_time + exec_time).as_micros() as u64, - session_objects: vm.session_object_count().saturating_sub(pre_session), - session_bytes: vm.session_bytes_allocated(), - epoch_objects: vm.epoch_object_count().saturating_sub(pre_epoch), + session_objects, + session_bytes, + epoch_objects, epoch_bytes: 0, - gc_trigger_count: gc_stats.total_collections, - gc_bytes_freed: gc_stats.last_collection_bytes_freed, - gc_objects_scanned: gc_stats.last_collection_objects_scanned, - gc_collection_us: gc_stats.last_collection_duration_us, - instruction_count: vm.instruction_count(), + gc_trigger_count, + gc_bytes_freed, + gc_objects_scanned, + gc_collection_us, + instruction_count, compile_time_us: compile_time.as_micros() as u64, exec_time_us: exec_time.as_micros() as u64, - ic_hit_rate: vm.ic_hit_rate(), - ic_hits: vm.ic_hit_count(), - ic_misses: vm.ic_miss_count(), + ic_hit_rate, + ic_hits, + ic_misses, + peak_bytes: peak_bytes as u64, + retained_bytes: retained_bytes as u64, + retained_objects: retained_objects as u64, }); } @@ -170,6 +198,9 @@ fn average_metrics(metrics: &[MetricCollection]) -> MetricCollection { ic_hit_rate: 0.0, ic_hits: 0, ic_misses: 0, + peak_bytes: 0, + retained_bytes: 0, + retained_objects: 0, }); } MetricCollection { @@ -189,5 +220,8 @@ fn average_metrics(metrics: &[MetricCollection]) -> MetricCollection { ic_hit_rate: metrics.iter().map(|m| m.ic_hit_rate).sum::() / n, ic_hits: (metrics.iter().map(|m| m.ic_hits as f64).sum::() / n) as u64, ic_misses: (metrics.iter().map(|m| m.ic_misses as f64).sum::() / n) as u64, + peak_bytes: (metrics.iter().map(|m| m.peak_bytes as f64).sum::() / n) as u64, + retained_bytes: (metrics.iter().map(|m| m.retained_bytes as f64).sum::() / n) as u64, + retained_objects: (metrics.iter().map(|m| m.retained_objects as f64).sum::() / n) as u64, } } diff --git a/crates/oxide_cli/src/bench/leak_detect.rs b/crates/oxide_cli/src/bench/leak_detect.rs index bd5876c1..9b14cee7 100644 --- a/crates/oxide_cli/src/bench/leak_detect.rs +++ b/crates/oxide_cli/src/bench/leak_detect.rs @@ -138,6 +138,9 @@ pub fn run_leak_detect(config: &BenchConfig, kernel: &Arc, pool: &Ar ic_hit_rate: vm.ic_hit_rate(), ic_hits: vm.ic_hit_count(), ic_misses: vm.ic_miss_count(), + peak_bytes: vm.session_bytes_peak() as u64, + retained_bytes: vm.session_bytes_allocated() as u64, + retained_objects: vm.session_object_count() as u64, }); } } diff --git a/crates/oxide_cli/src/bench/metrics.rs b/crates/oxide_cli/src/bench/metrics.rs index f9d811b0..0d562c7c 100644 --- a/crates/oxide_cli/src/bench/metrics.rs +++ b/crates/oxide_cli/src/bench/metrics.rs @@ -19,6 +19,15 @@ pub struct MetricCollection { pub ic_hit_rate: f64, pub ic_hits: u64, pub ic_misses: u64, + /// 执行期 session 堆账目的峰值高水位(字节)。旧基线文件无此字段,反序列化补 0。 + #[serde(default)] + pub peak_bytes: u64, + /// workload 结束并强制完整 GC 后的 session 存活堆字节(留存内存)。 + #[serde(default)] + pub retained_bytes: u64, + /// workload 结束并强制完整 GC 后的 session 存活对象数。 + #[serde(default)] + pub retained_objects: u64, } impl MetricCollection { @@ -40,6 +49,9 @@ impl MetricCollection { ("ic_hit_rate", self.ic_hit_rate), ("ic_hits", self.ic_hits as f64), ("ic_misses", self.ic_misses as f64), + ("peak_bytes", self.peak_bytes as f64), + ("retained_bytes", self.retained_bytes as f64), + ("retained_objects", self.retained_objects as f64), ] } } diff --git a/crates/oxide_cli/src/bench/output.rs b/crates/oxide_cli/src/bench/output.rs index a46fe049..14d3815d 100644 --- a/crates/oxide_cli/src/bench/output.rs +++ b/crates/oxide_cli/src/bench/output.rs @@ -5,19 +5,47 @@ pub fn format_json(results: &[MetricCollection]) -> String { serde_json::to_string_pretty(results).unwrap_or_else(|e| format!("{{\"error\": \"{}\"}}", e)) } +/// 内存基准用例(`mem_*` 前缀)的留存形态说明,随表格尾部输出。 +const MEMORY_BENCH_NOTES: &str = "\n内存基准用例(mem_*):\n + mem_object_graph 大型对象图留存:15 层满二叉树 32767 节点整体驻留 session 堆 + mem_string_accum 字符串累积留存:40000 个互不相同的字符串驻留数组(interner 压力) + mem_closure_chain 闭包/upvalue 长链:10000 层闭包各自捕获前层闭包与 payload 驻留 + mem_array_grow 数组增缩容量:扩到 200000 元素后截回 1000,观测元素向量容量是否回落(账目按 Vec capacity 计) + mem_cross_call_retain 跨调用长存活数据:全局 store 经 30000 次调用累积 30000 条记录 + mem_map_retain 原生盒边持有:Map 持 20000 组字符串键 + 对象值 + mem_set_retain 原生盒边持有:Set 持 20000 个对象(各带 payload 字符串) + mem_string_rope 拼接 rope 链留存:重复二元拼接形成深 Cons 链(账目按逻辑长度计,数值高于实际足迹) +口径:Peak B/Ret B 为 session 堆账目(对象头 + 堆数据 + 存活串/BigInt);epoch arena +的临时驻留无字节账目(既有口径,数量见 JSON 的 epoch_objects)。Ret B 为 workload 后 +晋升 + 完整 GC 的真存活集。 +"; + /// 把结果格式化为对齐的文本表格(供终端打印)。 +/// +/// `Sess B`/`Peak B`/`Ret B` 为 session 堆账目(字节):执行期累计 / 峰值高水位 / +/// workload 后强制 GC 的存活留存。 pub fn format_text_table(results: &[MetricCollection]) -> String { let mut out = String::new(); out.push_str(&format!( - "{:<35} {:>10} {:>10} {:>10} {:>12} {:>8} {:>8} {:>10} {:>10}\n", - "Test Name", "Wall(ms)", "Comp(ms)", "Exec(ms)", "Instrs", "GC Ct", "IC Rate", "Sess Objs", "Sess B", + "{:<35} {:>10} {:>10} {:>10} {:>12} {:>8} {:>8} {:>10} {:>10} {:>10} {:>10}\n", + "Test Name", + "Wall(ms)", + "Comp(ms)", + "Exec(ms)", + "Instrs", + "GC Ct", + "IC Rate", + "Sess Objs", + "Sess B", + "Peak B", + "Ret B", )); - out.push_str(&"-".repeat(120)); + out.push_str(&"-".repeat(150)); out.push('\n'); for m in results { out.push_str(&format!( - "{:<35} {:>10.2} {:>10.3} {:>10.3} {:>12} {:>8} {:>7.1}% {:>10} {:>10}", + "{:<35} {:>10.2} {:>10.3} {:>10.3} {:>12} {:>8} {:>7.1}% {:>10} {:>10} {:>10} {:>10}", truncate(&m.test_name, 35), m.wall_time_us as f64 / 1000.0, m.compile_time_us as f64 / 1000.0, @@ -27,9 +55,12 @@ pub fn format_text_table(results: &[MetricCollection]) -> String { m.ic_hit_rate * 100.0, m.session_objects, m.session_bytes, + m.peak_bytes, + m.retained_bytes, )); out.push('\n'); } + out.push_str(MEMORY_BENCH_NOTES); out } diff --git a/crates/oxide_vm/src/session_arena.rs b/crates/oxide_vm/src/session_arena.rs index a5a77f8c..0f4e8352 100644 --- a/crates/oxide_vm/src/session_arena.rs +++ b/crates/oxide_vm/src/session_arena.rs @@ -130,7 +130,7 @@ impl Vm { /// 函数目标豁免均直落 epoch 值);Map/Set 等原生盒按键值直插 epoch 值。 /// `rewrite_object_values` 覆盖元素/meta/属性/proto/captured_this/home_object/ /// cell 值;克隆子树经 forwarding 去重,环与共享引用各克隆一次。 - pub(crate) fn promote_session_epoch_refs(&mut self) { + pub fn promote_session_epoch_refs(&mut self) { let objects = std::mem::take(&mut self.gc_state.session_object_ptrs); if objects.is_empty() { return; @@ -185,6 +185,40 @@ impl Vm { self.gc_state.session_object_ptrs.extend(objects); } + /// 把根直接持有的 epoch 对象(顶层 var 寄存器、挂起句柄等)晋升进 session, + /// 并把根引用改写到克隆体。 + /// + /// # 副作用 + /// - 每个根 epoch 对象深克隆进 session(含 native 状态盒,子引用递归晋升), + /// 账目计入克隆字节;根引用按转发表重写。 + /// + /// # 注意事项 + /// - 供 workload 后观测点(基准留存测量)使用:本方法之后存活集完全对 + /// session 可见,后续完整 GC 的留存账目不再漏"仅驻留 epoch arena 的对象"。 + /// - 与 `promote_session_epoch_refs` 互补:本方法处理根直接持有的 epoch 对象, + /// 后者处理 session 对象持有的 epoch 子引用(闭包捕获等绕过写屏障的来源)。 + pub fn promote_rooted_epoch_objects(&mut self) { + let mut epoch_roots = Vec::new(); + self.for_each_root(|value| { + if value.is_object() { + let ptr = value.as_js_object_ptr(); + if !ptr.is_null() { + // SAFETY: 根上的对象值均为 VM 自有存活 JsObject。 + if unsafe { &*ptr }.is_epoch() { + epoch_roots.push(ptr); + } + } + } + }); + let mut forwarding = std::mem::take(&mut self.gc_state.forwarding); + for ptr in epoch_roots { + self.promote_object_inner(ptr, &mut forwarding); + } + crate::session_gc::rewrite_vm_roots(self, &forwarding); + forwarding.clear(); + self.gc_state.forwarding = forwarding; + } + /// 逃逸写屏障:写向全局/session 对象的对象值不指向 epoch,否则 epoch /// 重置后悬垂。session 函数目标豁免晋升——克隆会令写入侧与字节码持有的 /// 原始对象分裂(类构造器在原型上续建方法会落到非克隆体);函数持有的 diff --git a/crates/oxide_vm/src/session_gc.rs b/crates/oxide_vm/src/session_gc.rs index 256d7d3e..7302b18d 100644 --- a/crates/oxide_vm/src/session_gc.rs +++ b/crates/oxide_vm/src/session_gc.rs @@ -915,7 +915,7 @@ fn rewrite_forwarded_value( .unwrap_or(value) } -fn rewrite_vm_roots(vm: &mut Vm, forwarding: &HashMap<*mut JsObject, *mut JsObject, FxBuildHasher>) { +pub(crate) fn rewrite_vm_roots(vm: &mut Vm, forwarding: &HashMap<*mut JsObject, *mut JsObject, FxBuildHasher>) { vm_debug!("[GC] rewrite_vm_roots: {} forwarded objects", forwarding.len()); // 统一遍历:与 for_each_value 共用同一字段清单。 vm.rewrite_values(|value| rewrite_forwarded_value(value, forwarding)); diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index cb8cb30d..dc06234a 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -969,6 +969,26 @@ impl Vm { self.gc_state.session_bytes_allocated } + /// 执行期 session 堆账目的峰值高水位(顶层指令边界采样,全量重置清零)。 + pub fn session_bytes_peak(&self) -> usize { + self.gc_state.session_bytes_peak + } + + /// 无条件执行一次完整 session GC(mark + 移动式 sweep + 串/BigInt 清扫)。 + /// + /// # 副作用 + /// - 存活对象复制进新 session arena,全部根与原生盒按转发表重写; + /// `session_bytes_allocated` 重置为清扫后的存活字节。 + /// + /// # 注意事项 + /// - 须在执行外的安全点调用(无在途 builtin 局部裸指针、dispatch 未重入); + /// 执行期触发仍走水位路径,本入口供事后观测(如基准测 workload 后留存堆)。 + pub fn collect_session_gc(&mut self) { + let mut session_gc = std::mem::take(&mut self.gc_state.session_gc); + session_gc.collect(self); + self.gc_state.session_gc = session_gc; + } + /// 当前 epoch 中已分配并跟踪的对象数量(未晋升到 session 的临时对象)。 pub fn epoch_object_count(&self) -> usize { self.gc_state.epoch_object_ptrs.len() @@ -1517,9 +1537,15 @@ impl Vm { // inline 状态(非 GC 根),此时回收会把调用方 regs 中的活值当死值释放。 // 返回顶层后检查恢复,存活值此时已回拷为执行根。账目未超水位时仅 // 少量字段比较。 - if self.native_call_depth == 0 && self.gc_state.session_bytes_allocated >= self.gc_state.string_gc_watermark - { - self.maybe_collect_session_strings(); + if self.native_call_depth == 0 { + // 峰值高水位:同一边界采样 session 堆账目上界 + let bytes = self.gc_state.session_bytes_allocated; + if bytes > self.gc_state.session_bytes_peak { + self.gc_state.session_bytes_peak = bytes; + } + if bytes >= self.gc_state.string_gc_watermark { + self.maybe_collect_session_strings(); + } } if let Some(max_steps) = max_steps { if steps > max_steps { diff --git a/crates/oxide_vm/src/vm_state.rs b/crates/oxide_vm/src/vm_state.rs index 6fec962b..cc126a79 100644 --- a/crates/oxide_vm/src/vm_state.rs +++ b/crates/oxide_vm/src/vm_state.rs @@ -38,6 +38,9 @@ pub(crate) struct GcState { /// `cell.value` 中的对象引用),只在 full_reset 统一释放。 pub(crate) session_cell_ptrs: RefCell>, pub(crate) session_bytes_allocated: usize, + /// 执行期 session 堆账目的峰值高水位(`session_bytes_allocated` 的采样上界), + /// 顶层指令边界采样,全量重置清零。留存内存观测用。 + pub(crate) session_bytes_peak: usize, /// 执行期字符串 GC 的触发水位:本次收集后的存活字节 + 阈值增量。 /// 仅当账目超过水位才在指令边界触发回收——活串超阈值时不会每指令重复 /// 触发无死串可回收的白跑,且保证触发点恒在无 builtin 局部活值的边界。 diff --git a/crates/oxide_vm/src/vm_support.rs b/crates/oxide_vm/src/vm_support.rs index f9858f0d..a8fb82cd 100644 --- a/crates/oxide_vm/src/vm_support.rs +++ b/crates/oxide_vm/src/vm_support.rs @@ -100,6 +100,7 @@ impl Vm { session_bigint_ptrs: std::cell::RefCell::new(Vec::new()), session_cell_ptrs: std::cell::RefCell::new(Vec::new()), session_bytes_allocated: 0, + session_bytes_peak: 0, string_gc_watermark: gc_threshold, gc_threshold_cached: gc_threshold, gc_watermark: gc_threshold, @@ -212,6 +213,7 @@ impl Vm { session_bigint_ptrs: std::cell::RefCell::new(Vec::new()), session_cell_ptrs: std::cell::RefCell::new(Vec::new()), session_bytes_allocated: 0, + session_bytes_peak: 0, string_gc_watermark: gc_threshold, gc_threshold_cached: gc_threshold, gc_watermark: gc_threshold, @@ -329,6 +331,7 @@ impl Vm { self.gc_state.epoch_object_ptrs.clear(); self.gc_state.session_epoch.reset(); self.gc_state.session_bytes_allocated = 0; + self.gc_state.session_bytes_peak = 0; self.gc_state.string_gc_watermark = self.kernel_core.config().session_gc_threshold; self.gc_state.session_gc = crate::session_gc::SessionGc::new(); self.symbols.reset(); diff --git a/tests/stress/mem_array_grow.js b/tests/stress/mem_array_grow.js new file mode 100644 index 00000000..550914ad --- /dev/null +++ b/tests/stress/mem_array_grow.js @@ -0,0 +1,8 @@ +// 数组增缩容量:填满 200000 元素后截回 1000,观测容量是否回落 +// 堆账目按元素 Vec capacity 计——截短后若不收缩,留存账目仍反映大容量 +var arr = []; +for (var i = 0; i < 200000; i++) { + arr[i] = i * 3 + 1; +} +arr.length = 1000; +arr.length diff --git a/tests/stress/mem_closure_chain.js b/tests/stress/mem_closure_chain.js new file mode 100644 index 00000000..19050705 --- /dev/null +++ b/tests/stress/mem_closure_chain.js @@ -0,0 +1,17 @@ +// 闭包/upvalue 长链留存:10000 层闭包,每层同时捕获前层闭包与自身 payload 对象, +// 自 head 沿 prev 链回溯第一层时全部驻留(函数对象、upvalue cell、payload 串) +var head = null; +for (var i = 0; i < 10000; i++) { + (function (prev, payload) { + head = function () { + return [prev, payload]; + }; + })(head, { id: i, data: "closure_payload_padding_" + i }); +} +var cur = head; +var hops = 0; +while (cur !== null) { + cur = cur()[0]; + hops++; +} +hops === 10000 diff --git a/tests/stress/mem_cross_call_retain.js b/tests/stress/mem_cross_call_retain.js new file mode 100644 index 00000000..d089c8ec --- /dev/null +++ b/tests/stress/mem_cross_call_retain.js @@ -0,0 +1,12 @@ +// 跨调用长存活数据:全局 store 经 30000 次函数调用累积 30000 条记录, +// 记录在函数内构造、写出 global 后跨帧存活(session 堆) +var store = { records: [], total: 0 }; +function logRecord(tag, value) { + var r = { seq: store.total, tag: tag, value: value }; + store.records.push(r); + store.total++; +} +for (var i = 0; i < 30000; i++) { + logRecord("tag_" + (i % 16), "record_payload_" + i); +} +store.records.length diff --git a/tests/stress/mem_map_retain.js b/tests/stress/mem_map_retain.js new file mode 100644 index 00000000..98c6f3d7 --- /dev/null +++ b/tests/stress/mem_map_retain.js @@ -0,0 +1,7 @@ +// 原生盒边持有:Map 持 20000 组字符串键 + 对象值, +// 键串与值对象(及其 payload 串)全部经 Map 原生盒边驻留 +var m = new Map(); +for (var i = 0; i < 20000; i++) { + m.set("map_key_" + i, { id: i, data: "map_value_payload_" + i }); +} +m.size diff --git a/tests/stress/mem_object_graph.js b/tests/stress/mem_object_graph.js new file mode 100644 index 00000000..84700a68 --- /dev/null +++ b/tests/stress/mem_object_graph.js @@ -0,0 +1,16 @@ +// 大型对象图留存:15 层满二叉树共 32767 个节点,顶层 root 整体驻留 session 堆 +// 每节点 id 唯一(免意外共享),内节点带 left/right 子引用,叶节点带 leaf 标记 +function makeNode(depth, base) { + if (depth === 0) { + return { id: base, leaf: 1 }; + } + return { + id: base, + depth: depth, + left: makeNode(depth - 1, base * 2), + right: makeNode(depth - 1, base * 2 + 1), + }; +} + +var root = makeNode(14, 1); +root.left.id + root.right.right.id diff --git a/tests/stress/mem_set_retain.js b/tests/stress/mem_set_retain.js new file mode 100644 index 00000000..40d5b915 --- /dev/null +++ b/tests/stress/mem_set_retain.js @@ -0,0 +1,7 @@ +// 原生盒边持有:Set 持 20000 个对象,每个对象带 payload 字符串, +// 全部经 Set 原生盒边驻留 +var s = new Set(); +for (var i = 0; i < 20000; i++) { + s.add({ id: i, data: "set_value_payload_" + i }); +} +s.size diff --git a/tests/stress/mem_string_accum.js b/tests/stress/mem_string_accum.js new file mode 100644 index 00000000..3714ebaa --- /dev/null +++ b/tests/stress/mem_string_accum.js @@ -0,0 +1,7 @@ +// 字符串累积留存:40000 个互不相同的字符串驻留数组 +// 内容由索引推导(无去重可合并),数组本身经顶层 var 驻留 +var pool = []; +for (var i = 0; i < 40000; i++) { + pool[i] = "str_" + i + "_" + (i * 7 % 997) + "_padding_padding_padding"; +} +pool.length diff --git a/tests/stress/mem_string_rope.js b/tests/stress/mem_string_rope.js new file mode 100644 index 00000000..d79e1688 --- /dev/null +++ b/tests/stress/mem_string_rope.js @@ -0,0 +1,10 @@ +// 拼接 rope 链留存:对 200 字节字面量重复二元拼接,形成深 Cons 链 +// 每链节点账目按拼接逻辑长度计,报告值高于实际字节足迹; +// 链自顶层 var 驻留,节点地址稳定不搬移 +var piece = + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +var chain = "seed_seed_seed"; +for (var i = 0; i < 1000; i++) { + chain = chain + piece; +} +chain.length