diff --git a/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json b/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json index 863e9a37b..28db5dbfb 100644 --- a/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json +++ b/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json @@ -12,7 +12,7 @@ "prerelease": true }, "engineVersion": "0.17.0", - "measuredAt": "2026-09-12T04:44:36.717Z", + "measuredAt": "2026-09-12T15:28:04.015Z", "runs": 3 }, "rendering": { @@ -43,7 +43,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:11:17.999Z" + "timestamp": "2026-09-12T13:24:31.244Z" }, { "backend": "webgpu", @@ -70,7 +70,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:18:01.494Z" + "timestamp": "2026-09-12T13:49:20.156Z" } ] }, @@ -100,7 +100,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:23:07.261Z" + "timestamp": "2026-09-12T13:59:39.622Z" }, { "backend": "webgpu", @@ -127,7 +127,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:29:50.278Z" + "timestamp": "2026-09-12T14:25:33.987Z" } ] }, @@ -157,7 +157,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:34:54.521Z" + "timestamp": "2026-09-12T14:35:54.509Z" }, { "backend": "webgpu", @@ -184,7 +184,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:41:40.647Z" + "timestamp": "2026-09-12T15:01:48.661Z" } ] } @@ -226,34 +226,34 @@ "cells": [ { "competitor": "excalibur", - "referenceMs": 0.2199999999997999, - "referenceP95Ms": 0.40000000000009095, - "referenceGpuMs": 16.660000000000082, + "referenceMs": 0.22000000000002728, + "referenceP95Ms": 0.3999999999998636, + "referenceGpuMs": 16.680000000000007, "referenceOverFrameBudget": false, - "competitorMs": 2.339999999999975, - "competitorP95Ms": 9.620000000000118, - "competitorGpuMs": 16.660000000000082, + "competitorMs": 2.420000000000016, + "competitorP95Ms": 9.340000000000146, + "competitorGpuMs": 16.679999999999836, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.09401709401700951, - "factor": 10.636363636373197, - "label": "ExoJS leads clearly (10.64x)", + "ratio": 0.09090909090910158, + "factor": 10.999999999998709, + "label": "ExoJS leads clearly (11.00x)", "structural": true }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.20000000000004547, - "maxMs": 0.2400000000000091, - "ratio": 1.1999999999997726 + "minMs": 0.18000000000006366, + "maxMs": 0.22000000000014097, + "ratio": 1.2222222222225732 }, "competitor": { - "minMs": 2.2800000000000864, - "maxMs": 2.4500000000000455, - "ratio": 1.0745614035087512 + "minMs": 2.230000000000018, + "maxMs": 2.659999999999968, + "ratio": 1.1928251121075992 }, "stable": true, "rungs": [ @@ -265,34 +265,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.2199999999997999, - "referenceP95Ms": 0.40000000000009095, - "referenceGpuMs": 16.660000000000082, + "referenceMs": 0.22000000000002728, + "referenceP95Ms": 0.3999999999998636, + "referenceGpuMs": 16.680000000000007, "referenceOverFrameBudget": false, - "competitorMs": 1.2100000000000364, - "competitorP95Ms": 1.759999999999991, - "competitorGpuMs": 16.679999999999836, + "competitorMs": 1.240000000000009, + "competitorP95Ms": 1.740000000000009, + "competitorGpuMs": 16.660000000000082, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.181818181818011, - "factor": 5.500000000005167, - "label": "ExoJS leads clearly (5.50x)", + "ratio": 0.1774193548387304, + "factor": 5.6363636363629785, + "label": "ExoJS leads clearly (5.64x)", "structural": true }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.20000000000004547, - "maxMs": 0.2400000000000091, - "ratio": 1.1999999999997726 + "minMs": 0.18000000000006366, + "maxMs": 0.22000000000014097, + "ratio": 1.2222222222225732 }, "competitor": { - "minMs": 1.2000000000001592, - "maxMs": 1.3199999999999363, - "ratio": 1.0999999999998011 + "minMs": 1.2199999999998, + "maxMs": 1.2500000000002274, + "ratio": 1.0245901639347808 }, "stable": true, "rungs": [ @@ -304,19 +304,19 @@ }, { "competitor": "pixi", - "referenceMs": 0.2199999999997999, - "referenceP95Ms": 0.40000000000009095, - "referenceGpuMs": 16.660000000000082, + "referenceMs": 0.22000000000002728, + "referenceP95Ms": 0.3999999999998636, + "referenceGpuMs": 16.680000000000007, "referenceOverFrameBudget": false, - "competitorMs": 0.1999999999998181, - "competitorP95Ms": 0.4399999999999409, - "competitorGpuMs": 16.660000000000082, + "competitorMs": 0.19000000000005457, + "competitorP95Ms": 0.36000000000001364, + "competitorGpuMs": 16.680000000000007, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 1.1578947368419163, + "factor": 1, + "label": "level", "structural": false }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", @@ -324,18 +324,18 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 0.20000000000004547, - "maxMs": 0.2400000000000091, - "ratio": 1.1999999999997726 + "minMs": 0.18000000000006366, + "maxMs": 0.22000000000014097, + "ratio": 1.2222222222225732 }, "competitor": { - "minMs": 0.18000000000006366, - "maxMs": 0.20000000000004547, - "ratio": 1.1111111111109708 + "minMs": 0.16999999999995907, + "maxMs": 0.19999999999998863, + "ratio": 1.1764705882355104 }, - "stable": false, + "stable": true, "rungs": [ - "competitor-leads", + "level", "level", "level" ] @@ -346,41 +346,41 @@ { "archetype": "static-heavy", "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "count": 5000, + "loadId": "5k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.13999999999987267, - "referenceP95Ms": 0.24000000000023647, + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, - "competitorMs": 19.739999999999554, - "competitorP95Ms": 24.0600000000004, - "competitorGpuMs": 20.780000000000655, - "competitorOverFrameBudget": true, + "competitorMs": 8.970000000000027, + "competitorP95Ms": 13.220000000000255, + "competitorGpuMs": 16.66000000000031, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.007092198581553993, - "factor": 141.00000000012506, - "label": "ExoJS leads clearly (141.00x)", + "ratio": 0.013377926421392475, + "factor": 74.75000000006821, + "label": "ExoJS leads clearly (74.75x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13999999999987267, - "maxMs": 0.16000000000030923, - "ratio": 1.142857142860391 + "minMs": 0.1000000000003638, + "maxMs": 0.15999999999985448, + "ratio": 1.5999999999927241 }, "competitor": { - "minMs": 19.439999999999827, - "maxMs": 20.24000000000001, - "ratio": 1.0411522633744954 + "minMs": 8.910000000000082, + "maxMs": 8.990000000000009, + "ratio": 1.008978675645334 }, "stable": true, "rungs": [ @@ -392,34 +392,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.13999999999987267, - "referenceP95Ms": 0.24000000000023647, + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, - "competitorMs": 3.0800000000001546, - "competitorP95Ms": 7.2400000000002365, + "competitorMs": 2.740000000000009, + "competitorP95Ms": 4.579999999999927, "competitorGpuMs": 16.66000000000031, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.04545454545450183, - "factor": 22.000000000021114, - "label": "ExoJS leads clearly (22.00x)", + "ratio": 0.043795620437916224, + "factor": 22.833333333354176, + "label": "ExoJS leads clearly (22.83x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13999999999987267, - "maxMs": 0.16000000000030923, - "ratio": 1.142857142860391 + "minMs": 0.1000000000003638, + "maxMs": 0.15999999999985448, + "ratio": 1.5999999999927241 }, "competitor": { - "minMs": 3.0499999999999545, - "maxMs": 3.100000000000364, - "ratio": 1.0163934426230852 + "minMs": 2.380000000000109, + "maxMs": 2.9200000000000728, + "ratio": 1.2268907563024953 }, "stable": true, "rungs": [ @@ -431,39 +431,39 @@ }, { "competitor": "pixi", - "referenceMs": 0.13999999999987267, - "referenceP95Ms": 0.24000000000023647, + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999987267, - "competitorP95Ms": 0.27999999999974534, - "competitorGpuMs": 16.66000000000031, + "competitorMs": 0.13000000000010914, + "competitorP95Ms": 0.25999999999976353, + "competitorGpuMs": 16.679999999999836, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13999999999987267, - "maxMs": 0.16000000000030923, - "ratio": 1.142857142860391 + "minMs": 0.1000000000003638, + "maxMs": 0.15999999999985448, + "ratio": 1.5999999999927241 }, "competitor": { - "minMs": 0.13999999999987267, + "minMs": 0.09999999999990905, "maxMs": 0.13999999999987267, - "ratio": 1 + "ratio": 1.4 }, - "stable": true, + "stable": false, "rungs": [ "level", - "level", + "exojs-leads", "level" ] } @@ -473,60 +473,99 @@ { "archetype": "static-heavy", "category": "Node scaling", - "count": 100000, - "loadId": "100k", + "count": 10000, + "loadId": "10k", "unit": "sprites", - "primary": false, + "primary": true, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.07000000000016371, - "referenceP95Ms": 0.2600000000002183, - "referenceGpuMs": 16.659999999999854, + "competitor": "excalibur", + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.28000000000065484, + "referenceGpuMs": 16.68000000000029, + "referenceOverFrameBudget": false, + "competitorMs": 19.370000000000346, + "competitorP95Ms": 24.76000000000022, + "competitorGpuMs": 20.800000000000182, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.006195147134738705, + "factor": 161.41666666681635, + "label": "ExoJS leads clearly (161.42x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1000000000003638, + "maxMs": 0.14000000000010004, + "ratio": 1.3999999999959072 + }, + "competitor": { + "minMs": 18.65000000000009, + "maxMs": 20.59999999999991, + "ratio": 1.1045576407506599 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "phaser", + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.28000000000065484, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 0.03999999999996362, - "competitorP95Ms": 0.21999999999934516, + "competitorMs": 3.100000000000364, + "competitorP95Ms": 7.260000000000218, "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.7500000000056843, - "factor": 1.7500000000056843, - "label": "competitor leads (1.75x)", - "structural": false + "side": "exojs", + "ratio": 0.03870967741931509, + "factor": 25.83333333335986, + "label": "ExoJS leads clearly (25.83x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000040018, - "maxMs": 0.07999999999992724, - "ratio": 1.3333333333232278 + "minMs": 0.1000000000003638, + "maxMs": 0.14000000000010004, + "ratio": 1.3999999999959072 }, "competitor": { - "minMs": 0.020000000000436557, - "maxMs": 0.03999999999996362, - "ratio": 1.9999999999545253 + "minMs": 3.0799999999999272, + "maxMs": 3.2400000000002365, + "ratio": 1.0519480519481537 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { - "competitor": "phaser", - "referenceMs": 0.07500000000004547, - "referenceP95Ms": 0.24000000000023647, - "referenceGpuMs": 16.659999999999854, + "competitor": "pixi", + "referenceMs": 0.11999999999989086, + "referenceP95Ms": 0.28000000000065484, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 17.670000000000073, - "competitorP95Ms": 22.52999999999929, - "competitorGpuMs": 18.840000000000146, - "competitorOverFrameBudget": true, + "competitorMs": 0.11999999999989086, + "competitorP95Ms": 0.23999999999978172, + "competitorGpuMs": 16.660000000000764, + "competitorOverFrameBudget": false, "verdict": { "side": "neither", "ratio": null, @@ -534,67 +573,68 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 0.07000000000016371, - "maxMs": 0.07999999999992724, - "ratio": 1.1428571428534307 + "minMs": 0.1000000000003638, + "maxMs": 0.14000000000010004, + "ratio": 1.3999999999959072 }, "competitor": { - "minMs": 17.3100000000004, - "maxMs": 18.029999999999745, - "ratio": 1.0415944540727515 + "minMs": 0.07999999999992724, + "maxMs": 0.11999999999989086, + "ratio": 1.5 }, "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "competitor-leads" ] } } ] }, { - "archetype": "dynamic-heavy", + "archetype": "static-heavy", "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "count": 25000, + "loadId": "25k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 1.7500000000004547, - "referenceP95Ms": 2.4399999999996, - "referenceGpuMs": 16.660000000000764, + "referenceMs": 0.14000000000032742, + "referenceP95Ms": 0.23999999999978172, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 25.170000000000073, - "competitorP95Ms": 29.780000000002474, - "competitorGpuMs": 26.7400000000016, + "competitorMs": 66.83000000000084, + "competitorP95Ms": 74.69999999999891, + "competitorGpuMs": 67.64000000000124, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.06952721493843662, - "factor": 14.382857142853446, - "label": "ExoJS leads clearly (14.38x)", + "ratio": 0.0020948675744474885, + "factor": 477.35714285603245, + "label": "ExoJS leads clearly (477.36x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6399999999998727, - "maxMs": 1.819999999999709, - "ratio": 1.1097560975608842 + "minMs": 0.13000000000010914, + "maxMs": 0.15999999999985448, + "ratio": 1.2307692307670781 }, "competitor": { - "minMs": 25.090000000000146, - "maxMs": 25.48999999999978, - "ratio": 1.0159426066161672 + "minMs": 63.5900000000006, + "maxMs": 67.57999999999993, + "ratio": 1.0627457147350101 }, "stable": true, "rungs": [ @@ -606,78 +646,78 @@ }, { "competitor": "phaser", - "referenceMs": 1.7500000000004547, - "referenceP95Ms": 2.4399999999996, - "referenceGpuMs": 16.660000000000764, + "referenceMs": 0.14000000000032742, + "referenceP95Ms": 0.23999999999978172, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.25, - "competitorP95Ms": 8.420000000000073, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 5.019999999999527, + "competitorP95Ms": 6.119999999999891, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.5384615384616784, - "factor": 1.8571428571423745, - "label": "ExoJS leads (1.86x)", - "structural": false + "ratio": 0.027888446215207294, + "factor": 35.85714285705562, + "label": "ExoJS leads clearly (35.86x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6399999999998727, - "maxMs": 1.819999999999709, - "ratio": 1.1097560975608842 + "minMs": 0.13000000000010914, + "maxMs": 0.15999999999985448, + "ratio": 1.2307692307670781 }, "competitor": { - "minMs": 3.110000000000582, - "maxMs": 3.269999999999982, - "ratio": 1.051446945337418 + "minMs": 4.639999999999873, + "maxMs": 5.119999999999436, + "ratio": 1.1034482758619777 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 1.7500000000004547, - "referenceP95Ms": 2.4399999999996, - "referenceGpuMs": 16.660000000000764, + "referenceMs": 0.14000000000032742, + "referenceP95Ms": 0.23999999999978172, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.319999999999709, - "competitorP95Ms": 1.8800000000001091, + "competitorMs": 0.11000000000012733, + "competitorP95Ms": 0.22000000000025466, "competitorGpuMs": 16.67999999999938, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.3257575757582125, - "factor": 1.3257575757582125, - "label": "competitor leads (1.33x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6399999999998727, - "maxMs": 1.819999999999709, - "ratio": 1.1097560975608842 + "minMs": 0.13000000000010914, + "maxMs": 0.15999999999985448, + "ratio": 1.2307692307670781 }, "competitor": { - "minMs": 1.2300000000000182, - "maxMs": 1.3399999999996908, - "ratio": 1.0894308943086757 + "minMs": 0.1000000000003638, + "maxMs": 0.11999999999989086, + "ratio": 1.199999999994543 }, - "stable": true, + "stable": false, "rungs": [ "competitor-leads", - "competitor-leads", + "level", "competitor-leads" ] } @@ -685,121 +725,81 @@ ] }, { - "archetype": "dynamic-all", + "archetype": "static-heavy", "category": "Node scaling", - "count": 1000, - "loadId": "1k", + "count": 100000, + "loadId": "100k", "unit": "sprites", "primary": false, "cells": [ - { - "competitor": "excalibur", - "referenceMs": 1.550000000000182, - "referenceP95Ms": 2.160000000000764, - "referenceGpuMs": 16.67999999999938, - "referenceOverFrameBudget": false, - "competitorMs": 3.3299999999999272, - "competitorP95Ms": 8.5, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.46546546546553025, - "factor": 2.1483870967738947, - "label": "ExoJS leads (2.15x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.480000000000473, - "maxMs": 1.8599999999996726, - "ratio": 1.256756756756134 - }, - "competitor": { - "minMs": 3.2599999999983993, - "maxMs": 3.5, - "ratio": 1.0736196319023676 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, { "competitor": "phaser", - "referenceMs": 1.550000000000182, - "referenceP95Ms": 2.160000000000764, - "referenceGpuMs": 16.67999999999938, + "referenceMs": 0.14000000000010004, + "referenceP95Ms": 0.27000000000043656, + "referenceGpuMs": 16.670000000000528, "referenceOverFrameBudget": false, - "competitorMs": 1.0200000000040745, - "competitorP95Ms": 1.4000000000087311, - "competitorGpuMs": 16.66000000000031, - "competitorOverFrameBudget": false, + "competitorMs": 17.6850000000004, + "competitorP95Ms": 20.540000000000873, + "competitorGpuMs": 18.289999999999964, + "competitorOverFrameBudget": true, "verdict": { - "side": "competitor", - "ratio": 1.5196078431313629, - "factor": 1.5196078431313629, - "label": "competitor leads (1.52x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", + "timer": "limited", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 1.480000000000473, - "maxMs": 1.8599999999996726, - "ratio": 1.256756756756134 + "minMs": 0.12000000000034561, + "maxMs": 0.15999999999985448, + "ratio": 1.3333333333282806 }, "competitor": { - "minMs": 0.9900000000052387, - "maxMs": 1.2399999999997817, - "ratio": 1.252525252518404 + "minMs": 17.470000000000255, + "maxMs": 17.900000000000546, + "ratio": 1.024613623354338 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 1.550000000000182, - "referenceP95Ms": 2.160000000000764, - "referenceGpuMs": 16.67999999999938, + "referenceMs": 0.12000000000034561, + "referenceP95Ms": 0.27999999999974534, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 1, - "competitorP95Ms": 1.4400000000005093, - "competitorGpuMs": 16.67999999999938, + "competitorMs": 0.09000000000014552, + "competitorP95Ms": 0.23999999999978172, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.550000000000182, - "factor": 1.550000000000182, - "label": "competitor leads (1.55x)", + "ratio": 1.3333333333350177, + "factor": 1.3333333333350177, + "label": "competitor leads (1.33x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.480000000000473, - "maxMs": 1.8599999999996726, - "ratio": 1.256756756756134 + "minMs": 0.11000000000012733, + "maxMs": 0.15999999999985448, + "ratio": 1.4545454545424479 }, "competitor": { - "minMs": 0.9600000000000364, - "maxMs": 1.0199999999999818, - "ratio": 1.0624999999999407 + "minMs": 0.05999999999994543, + "maxMs": 0.1000000000003638, + "ratio": 1.6666666666742458 }, "stable": true, "rungs": [ @@ -812,43 +812,43 @@ ] }, { - "archetype": "dynamic-all", + "archetype": "dynamic-heavy", "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "count": 1000, + "loadId": "1k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 3.8900000000003274, - "referenceP95Ms": 5.420000000000073, + "referenceMs": 0.3600000000005821, + "referenceP95Ms": 0.5199999999995271, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 30.55000000000109, - "competitorP95Ms": 35.55999999999767, - "competitorGpuMs": 31.81999999999971, - "competitorOverFrameBudget": true, + "competitorMs": 2.790000000000873, + "competitorP95Ms": 10.440000000002328, + "competitorGpuMs": 16.659999999999854, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.12733224222586542, - "factor": 7.853470437017614, - "label": "ExoJS leads clearly (7.85x)", + "ratio": 0.12903225806468438, + "factor": 7.749999999989894, + "label": "ExoJS leads clearly (7.75x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.8800000000010186, - "maxMs": 4.039999999999054, - "ratio": 1.0412371134015448 + "minMs": 0.35999999999921783, + "maxMs": 0.4499999999998181, + "ratio": 1.2500000000022107 }, "competitor": { - "minMs": 29.919999999998254, - "maxMs": 32.72999999999956, - "ratio": 1.0939171122995146 + "minMs": 2.720000000001164, + "maxMs": 3.110000000000582, + "ratio": 1.143382352940901 }, "stable": true, "rungs": [ @@ -860,78 +860,78 @@ }, { "competitor": "phaser", - "referenceMs": 3.8900000000003274, - "referenceP95Ms": 5.420000000000073, + "referenceMs": 0.3600000000005821, + "referenceP95Ms": 0.5199999999995271, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.0800000000017462, - "competitorP95Ms": 7.299999999999272, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 1.0099999999947613, + "competitorP95Ms": 1.3799999999901047, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.2629870129864031, - "factor": 1.2629870129864031, - "label": "competitor leads (1.26x)", + "side": "exojs", + "ratio": 0.35643564356678153, + "factor": 2.805555555536467, + "label": "ExoJS leads (2.81x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.8800000000010186, - "maxMs": 4.039999999999054, - "ratio": 1.0412371134015448 + "minMs": 0.35999999999921783, + "maxMs": 0.4499999999998181, + "ratio": 1.2500000000022107 }, "competitor": { - "minMs": 2.869999999999891, - "maxMs": 3.2399999999979627, - "ratio": 1.1289198606265107 + "minMs": 0.9400000000023283, + "maxMs": 1.2000000000000455, + "ratio": 1.2765957446777374 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 3.8900000000003274, - "referenceP95Ms": 5.420000000000073, + "referenceMs": 0.3600000000005821, + "referenceP95Ms": 0.5199999999995271, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.6599999999998545, - "competitorP95Ms": 8.959999999999127, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.3400000000001455, + "competitorP95Ms": 0.5, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.462406015037797, - "factor": 1.462406015037797, - "label": "competitor leads (1.46x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.8800000000010186, - "maxMs": 4.039999999999054, - "ratio": 1.0412371134015448 + "minMs": 0.35999999999921783, + "maxMs": 0.4499999999998181, + "ratio": 1.2500000000022107 }, "competitor": { - "minMs": 2.6500000000005457, - "maxMs": 2.6599999999998545, - "ratio": 1.0037735849053988 + "minMs": 0.27999999999974534, + "maxMs": 0.35999999999921783, + "ratio": 1.2857142857126616 }, - "stable": true, + "stable": false, "rungs": [ "competitor-leads", - "competitor-leads", + "level", "competitor-leads" ] } @@ -939,92 +939,43 @@ ] }, { - "archetype": "dynamic-all", + "archetype": "dynamic-heavy", "category": "Node scaling", - "count": 100000, - "loadId": "100k", + "count": 5000, + "loadId": "5k", "unit": "sprites", "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 39.42000000000098, - "referenceP95Ms": 41.82000000000153, - "referenceGpuMs": 41.68000000000029, - "referenceOverFrameBudget": true, - "competitorMs": 28.31000000000131, - "competitorP95Ms": 31.780000000000655, - "competitorGpuMs": 29.479999999999563, - "competitorOverFrameBudget": true, - "verdict": { - "side": "competitor", - "ratio": 1.3924408336276637, - "factor": 1.3924408336276637, - "label": "competitor leads (1.39x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 37.280000000000655, - "maxMs": 40.44999999999982, - "ratio": 1.0850321888411778 - }, - "competitor": { - "minMs": 27.109999999999673, - "maxMs": 28.360000000000582, - "ratio": 1.0461084470675368 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "nodes", - "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.5599999999994907, - "referenceP95Ms": 0.7799999999988358, - "referenceGpuMs": 16.679999999998472, + "referenceMs": 1.0200000000004366, + "referenceP95Ms": 1.5200000000004366, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 28.029999999998836, - "competitorP95Ms": 32.81999999999971, - "competitorGpuMs": 29.31999999999971, - "competitorOverFrameBudget": true, + "competitorMs": 10.499999999998181, + "competitorP95Ms": 14.080000000001746, + "competitorGpuMs": 16.659999999999854, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.019978594363164966, - "factor": 50.053571428614866, - "label": "ExoJS leads clearly (50.05x)", + "ratio": 0.09714285714291555, + "factor": 10.294117647052634, + "label": "ExoJS leads clearly (10.29x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999994907, - "maxMs": 0.5600000000013097, - "ratio": 1.0000000000032483 + "minMs": 0.930000000000291, + "maxMs": 1.180000000000291, + "ratio": 1.268817204300991 }, "competitor": { - "minMs": 27.57999999999811, - "maxMs": 33.38999999999942, - "ratio": 1.2106598984772192 + "minMs": 10.100000000000364, + "maxMs": 10.850000000000364, + "ratio": 1.0742574257425717 }, "stable": true, "rungs": [ @@ -1036,122 +987,122 @@ }, { "competitor": "phaser", - "referenceMs": 0.5599999999994907, - "referenceP95Ms": 0.7799999999988358, - "referenceGpuMs": 16.679999999998472, + "referenceMs": 1.0200000000004366, + "referenceP95Ms": 1.5200000000004366, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.0299999999999727, - "competitorP95Ms": 9.700000000000045, - "competitorGpuMs": 16.660000000000082, + "competitorMs": 2.6100000000001273, + "competitorP95Ms": 5.399999999994179, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.18481848184801838, - "factor": 5.410714285719158, - "label": "ExoJS leads clearly (5.41x)", - "structural": true + "ratio": 0.3908045977012976, + "factor": 2.5588235294107946, + "label": "ExoJS leads (2.56x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999994907, - "maxMs": 0.5600000000013097, - "ratio": 1.0000000000032483 + "minMs": 0.930000000000291, + "maxMs": 1.180000000000291, + "ratio": 1.268817204300991 }, "competitor": { - "minMs": 2.8400000000000887, - "maxMs": 3.150000000000034, - "ratio": 1.109154929577442 + "minMs": 2.5899999999965075, + "maxMs": 2.709999999991851, + "ratio": 1.046332046330311 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.5599999999994907, - "referenceP95Ms": 0.7799999999988358, - "referenceGpuMs": 16.679999999998472, + "referenceMs": 1.0200000000004366, + "referenceP95Ms": 1.5200000000004366, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.5799999999999272, - "competitorP95Ms": 0.819999999999709, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.7599999999993088, + "competitorP95Ms": 1.0600000000013097, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9655172413785533, - "factor": 1, - "label": "level", + "side": "competitor", + "ratio": 1.3421052631596897, + "factor": 1.3421052631596897, + "label": "competitor leads (1.34x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999994907, - "maxMs": 0.5600000000013097, - "ratio": 1.0000000000032483 + "minMs": 0.930000000000291, + "maxMs": 1.180000000000291, + "ratio": 1.268817204300991 }, "competitor": { - "minMs": 0.5600000000004002, - "maxMs": 0.589999999999236, - "ratio": 1.0535714285693114 + "minMs": 0.7200000000011642, + "maxMs": 0.8000000000010914, + "ratio": 1.1111111111108305 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "lifecycle-churn", + "archetype": "dynamic-heavy", "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "nodes", + "count": 10000, + "loadId": "10k", + "unit": "sprites", "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 2.4899999999997817, - "referenceP95Ms": 6.360000000000582, + "referenceMs": 1.5600000000004002, + "referenceP95Ms": 2.2600000000002183, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 24.619999999995343, - "competitorP95Ms": 28.220000000001164, - "competitorGpuMs": 25.860000000000582, + "competitorMs": 25.540000000000873, + "competitorP95Ms": 30.11999999999898, + "competitorGpuMs": 27.040000000000873, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.101137286758743, - "factor": 9.88755020080221, - "label": "ExoJS leads clearly (9.89x)", + "ratio": 0.06108065779171287, + "factor": 16.371794871791234, + "label": "ExoJS leads clearly (16.37x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.4899999999997817, - "maxMs": 2.6199999999989814, - "ratio": 1.0522088353410486 + "minMs": 1.5600000000004002, + "maxMs": 1.6599999999998545, + "ratio": 1.064102564102198 }, "competitor": { - "minMs": 23.270000000004075, - "maxMs": 25.799999999995634, - "ratio": 1.108723678555699 + "minMs": 25.410000000003492, + "maxMs": 26.020000000000437, + "ratio": 1.0240062967334458 }, "stable": true, "rungs": [ @@ -1163,34 +1114,34 @@ }, { "competitor": "phaser", - "referenceMs": 2.4899999999997817, - "referenceP95Ms": 6.360000000000582, + "referenceMs": 1.5600000000004002, + "referenceP95Ms": 2.2600000000002183, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 10.659999999999854, - "competitorP95Ms": 11.260000000002037, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 3.220000000001164, + "competitorP95Ms": 8.80000000000291, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.23358348968103337, - "factor": 4.281124497992285, - "label": "ExoJS leads (4.28x)", + "ratio": 0.4844720496893901, + "factor": 2.064102564102781, + "label": "ExoJS leads (2.06x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.4899999999997817, - "maxMs": 2.6199999999989814, - "ratio": 1.0522088353410486 + "minMs": 1.5600000000004002, + "maxMs": 1.6599999999998545, + "ratio": 1.064102564102198 }, "competitor": { - "minMs": 10.579999999999927, - "maxMs": 10.799999999999272, - "ratio": 1.0207939508505999 + "minMs": 3.0999999999994543, + "maxMs": 3.220000000001164, + "ratio": 1.0387096774199132 }, "stable": true, "rungs": [ @@ -1202,88 +1153,83 @@ }, { "competitor": "pixi", - "referenceMs": 2.4899999999997817, - "referenceP95Ms": 6.360000000000582, + "referenceMs": 1.5600000000004002, + "referenceP95Ms": 2.2600000000002183, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.4899999999997817, - "competitorP95Ms": 6.979999999999563, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 1.1700000000000728, + "competitorP95Ms": 1.7399999999997817, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", + "side": "competitor", + "ratio": 1.3333333333335924, + "factor": 1.3333333333335924, + "label": "competitor leads (1.33x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.4899999999997817, - "maxMs": 2.6199999999989814, - "ratio": 1.0522088353410486 + "minMs": 1.5600000000004002, + "maxMs": 1.6599999999998545, + "ratio": 1.064102564102198 }, "competitor": { - "minMs": 2.4799999999995634, - "maxMs": 2.5599999999994907, - "ratio": 1.0322580645161055 + "minMs": 1.139999999999418, + "maxMs": 1.180000000000291, + "ratio": 1.0350877192990293 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] - } - ] - }, - { - "title": "Fill and GPU state", - "rows": [ + }, { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 32, - "loadId": "32", - "unit": "layers", - "primary": true, + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.07999999999992724, - "referenceP95Ms": 0.12000000000080036, + "referenceMs": 1.4699999999993452, + "referenceP95Ms": 6.200000000000728, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.6600000000034925, - "competitorP95Ms": 0.8799999999973807, - "competitorGpuMs": 16.68000000000029, - "competitorOverFrameBudget": false, + "competitorMs": 69.53000000000247, + "competitorP95Ms": 80.71999999999389, + "competitorGpuMs": 71.37999999999738, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.12121212121136957, - "factor": 8.250000000051159, - "label": "ExoJS leads clearly (8.25x)", + "ratio": 0.02114195311375367, + "factor": 47.29931972791391, + "label": "ExoJS leads clearly (47.30x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999999992724, - "maxMs": 0.07999999999992724, - "ratio": 1 + "minMs": 1.4500000000007276, + "maxMs": 2.389999999999418, + "ratio": 1.648275862067737 }, "competitor": { - "minMs": 0.6399999999994179, - "maxMs": 0.680000000000291, - "ratio": 1.062500000001421 + "minMs": 67.82999999999811, + "maxMs": 69.63000000000102, + "ratio": 1.026536930561742 }, "stable": true, "rungs": [ @@ -1295,34 +1241,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.07999999999992724, - "referenceP95Ms": 0.12000000000080036, + "referenceMs": 1.4699999999993452, + "referenceP95Ms": 6.200000000000728, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.2600000000002183, - "competitorP95Ms": 0.44000000000005457, - "competitorGpuMs": 16.679999999999836, + "competitorMs": 4.580000000001746, + "competitorP95Ms": 6.239999999990687, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.30769230769176953, - "factor": 3.2500000000056843, - "label": "ExoJS leads (3.25x)", + "ratio": 0.32096069868969096, + "factor": 3.1156462585059774, + "label": "ExoJS leads (3.12x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999999992724, - "maxMs": 0.07999999999992724, - "ratio": 1 + "minMs": 1.4500000000007276, + "maxMs": 2.389999999999418, + "ratio": 1.648275862067737 }, "competitor": { - "minMs": 0.2600000000002183, - "maxMs": 0.2999999999999545, - "ratio": 1.1538461538450102 + "minMs": 4.460000000000036, + "maxMs": 5.05000000000291, + "ratio": 1.1322869955163384 }, "stable": true, "rungs": [ @@ -1334,13 +1280,13 @@ }, { "competitor": "pixi", - "referenceMs": 0.07999999999992724, - "referenceP95Ms": 0.12000000000080036, + "referenceMs": 1.4699999999993452, + "referenceP95Ms": 6.200000000000728, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.1000000000003638, - "competitorP95Ms": 0.2000000000007276, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 2.110000000000582, + "competitorP95Ms": 5.119999999998981, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -1349,107 +1295,68 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999999992724, - "maxMs": 0.07999999999992724, - "ratio": 1 + "minMs": 1.4500000000007276, + "maxMs": 2.389999999999418, + "ratio": 1.648275862067737 }, "competitor": { - "minMs": 0.09999999999854481, - "maxMs": 0.1000000000003638, - "ratio": 1.00000000001819 + "minMs": 2.0200000000004366, + "maxMs": 2.140000000001237, + "ratio": 1.0594059405944427 }, "stable": false, "rungs": [ "exojs-leads", - "exojs-leads", - "level" + "level", + "exojs-leads" ] } } ] }, { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ - { - "competitor": "excalibur", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.7400000000016007, - "referenceGpuMs": 16.659999999999854, - "referenceOverFrameBudget": false, - "competitorMs": 16.60000000000582, - "competitorP95Ms": 19.18000000000029, - "competitorGpuMs": 27.080000000001746, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.08433734939764845, - "factor": 11.85714285713469, - "label": "ExoJS leads clearly (11.86x)", - "structural": true - }, - "mechanism": "ExoJS issues fewer buffer uploads (0 vs 313 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.3700000000008004, - "maxMs": 1.4200000000000728, - "ratio": 1.0364963503644111 - }, - "competitor": { - "minMs": 15.959999999999127, - "maxMs": 19.349999999998545, - "ratio": 1.212406015037569 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, { "competitor": "phaser", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.7400000000016007, + "referenceMs": 4.699999999999818, + "referenceP95Ms": 7.180000000000291, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.019999999999527, - "competitorP95Ms": 4.5600000000004, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, + "competitorMs": 18.410000000003492, + "competitorP95Ms": 21.860000000000582, + "competitorGpuMs": 19.15999999998894, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.4635761589409518, - "factor": 2.1571428571402773, - "label": "ExoJS leads (2.16x)", + "ratio": 0.2552960347636571, + "factor": 3.917021276596639, + "label": "ExoJS leads (3.92x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3700000000008004, - "maxMs": 1.4200000000000728, - "ratio": 1.0364963503644111 + "minMs": 4.530000000000655, + "maxMs": 4.899999999999636, + "ratio": 1.0816777041940238 }, "competitor": { - "minMs": 2.7799999999997453, - "maxMs": 3.0599999999994907, - "ratio": 1.1007194244603493 + "minMs": 17.48999999999978, + "maxMs": 18.4800000000032, + "ratio": 1.056603773585102 }, "stable": true, "rungs": [ @@ -1461,161 +1368,161 @@ }, { "competitor": "pixi", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.7400000000016007, + "referenceMs": 4.699999999999818, + "referenceP95Ms": 7.180000000000291, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.2599999999983993, - "competitorP95Ms": 2.0599999999994907, + "competitorMs": 3.7600000000002183, + "competitorP95Ms": 5.959999999999127, "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.1111111111136776, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3700000000008004, - "maxMs": 1.4200000000000728, - "ratio": 1.0364963503644111 + "minMs": 4.530000000000655, + "maxMs": 4.899999999999636, + "ratio": 1.0816777041940238 }, "competitor": { - "minMs": 1.1499999999996362, - "maxMs": 1.2799999999997453, - "ratio": 1.1130434782610001 + "minMs": 3.130000000000109, + "maxMs": 4.470000000000255, + "ratio": 1.4281150159744724 }, - "stable": true, + "stable": false, "rungs": [ + "competitor-leads", "level", - "level", - "level" + "competitor-leads" ] } } ] }, { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.47000000000116415, - "referenceP95Ms": 0.7200000000011642, + "referenceMs": 1.4600000000000364, + "referenceP95Ms": 1.9200000000000728, "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 9.659999999999854, - "competitorP95Ms": 13.940000000002328, + "competitorMs": 3.1599999999962165, + "competitorP95Ms": 8.12000000000262, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.04865424430653947, - "factor": 20.553191489310482, - "label": "ExoJS leads clearly (20.55x)", - "structural": true + "ratio": 0.4620253164562609, + "factor": 2.1643835616411904, + "label": "ExoJS leads (2.16x)", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4599999999991269, - "maxMs": 0.4900000000016007, - "ratio": 1.0652173913098495 + "minMs": 1.360000000000582, + "maxMs": 1.5, + "ratio": 1.1029411764701162 }, "competitor": { - "minMs": 9.600000000002183, - "maxMs": 9.860000000000582, - "ratio": 1.0270833333331604 + "minMs": 2.9799999999995634, + "maxMs": 3.3300000000017462, + "ratio": 1.1174496644302798 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "phaser", - "referenceMs": 0.47000000000116415, - "referenceP95Ms": 0.7200000000011642, + "referenceMs": 1.4600000000000364, + "referenceP95Ms": 1.9200000000000728, "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 2.5399999999999636, - "competitorP95Ms": 4.579999999999927, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.9400000000023283, + "competitorP95Ms": 1.2200000000011642, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.18503937007920113, - "factor": 5.404255319135473, - "label": "ExoJS leads clearly (5.40x)", - "structural": true + "side": "competitor", + "ratio": 1.5531914893578938, + "factor": 1.5531914893578938, + "label": "competitor leads (1.55x)", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4599999999991269, - "maxMs": 0.4900000000016007, - "ratio": 1.0652173913098495 + "minMs": 1.360000000000582, + "maxMs": 1.5, + "ratio": 1.1029411764701162 }, "competitor": { - "minMs": 2.5399999999999636, - "maxMs": 2.6400000000003274, - "ratio": 1.0393700787403013 + "minMs": 0.9400000000023283, + "maxMs": 0.9499999999970896, + "ratio": 1.010638297866741 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.47000000000116415, - "referenceP95Ms": 0.7200000000011642, + "referenceMs": 1.4600000000000364, + "referenceP95Ms": 1.9200000000000728, "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 0.31999999999970896, - "competitorP95Ms": 0.4399999999986903, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.9200000000000728, + "competitorP95Ms": 1.1999999999989086, + "competitorGpuMs": 16.679999999998472, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.4687500000049738, - "factor": 1.4687500000049738, - "label": "competitor leads (1.47x)", + "ratio": 1.5869565217390444, + "factor": 1.5869565217390444, + "label": "competitor leads (1.59x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 120/0/0 vs 158/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4599999999991269, - "maxMs": 0.4900000000016007, - "ratio": 1.0652173913098495 + "minMs": 1.360000000000582, + "maxMs": 1.5, + "ratio": 1.1029411764701162 }, "competitor": { - "minMs": 0.2999999999992724, - "maxMs": 0.31999999999970896, - "ratio": 1.0666666666682836 + "minMs": 0.7600000000002183, + "maxMs": 1, + "ratio": 1.3157894736838327 }, "stable": true, "rungs": [ @@ -1626,50 +1533,45 @@ } } ] - } - ] - }, - { - "title": "Material variety", - "rows": [ + }, { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 5000, - "loadId": "5k", + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", "unit": "sprites", "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.08000000000174623, - "referenceP95Ms": 0.12000000000261934, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 4.140000000001237, + "referenceP95Ms": 5.200000000000728, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 10.299999999999272, - "competitorP95Ms": 14.340000000003783, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 31.910000000003492, + "competitorP95Ms": 37.25999999999476, + "competitorGpuMs": 32.83999999999651, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.007766990291432222, - "factor": 128.74999999718057, - "label": "ExoJS leads clearly (128.75x)", + "ratio": 0.1297398934503536, + "factor": 7.707729468597575, + "label": "ExoJS leads clearly (7.71x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999999810825, - "maxMs": 0.08000000000174623, - "ratio": 1.0000000000454747 + "minMs": 4.040000000000873, + "maxMs": 4.43999999999869, + "ratio": 1.0990099009895373 }, "competitor": { - "minMs": 9.930000000003929, - "maxMs": 10.350000000002183, - "ratio": 1.0422960725073602 + "minMs": 31.669999999998254, + "maxMs": 32.56000000000131, + "ratio": 1.0281023050206222 }, "stable": true, "rungs": [ @@ -1681,53 +1583,102 @@ }, { "competitor": "phaser", - "referenceMs": 0.08000000000174623, - "referenceP95Ms": 0.12000000000261934, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 4.140000000001237, + "referenceP95Ms": 5.200000000000728, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.7599999999997635, - "competitorP95Ms": 4.899999999999636, - "competitorGpuMs": 16.679999999998472, + "competitorMs": 3.2400000000052387, + "competitorP95Ms": 7.880000000004657, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.028985507247011988, - "factor": 34.49999999924398, - "label": "ExoJS leads clearly (34.50x)", - "structural": true + "side": "competitor", + "ratio": 1.2777777777760935, + "factor": 1.2777777777760935, + "label": "competitor leads (1.28x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999999810825, - "maxMs": 0.08000000000174623, - "ratio": 1.0000000000454747 + "minMs": 4.040000000000873, + "maxMs": 4.43999999999869, + "ratio": 1.0990099009895373 }, "competitor": { - "minMs": 2.5799999999999272, - "maxMs": 2.889999999999418, - "ratio": 1.1201550387594958 + "minMs": 3.2000000000116415, + "maxMs": 3.2700000000040745, + "ratio": 1.0218749999975558 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.08000000000174623, - "referenceP95Ms": 0.12000000000261934, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 4.140000000001237, + "referenceP95Ms": 5.200000000000728, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999854481, - "competitorP95Ms": 0.19999999999708962, - "competitorGpuMs": 16.679999999996653, + "competitorMs": 2.850000000000364, + "competitorP95Ms": 10.319999999999709, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.452631578947617, + "factor": 1.452631578947617, + "label": "competitor leads (1.45x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.040000000000873, + "maxMs": 4.43999999999869, + "ratio": 1.0990099009895373 + }, + "competitor": { + "minMs": 2.6599999999998545, + "maxMs": 2.860000000000582, + "ratio": 1.0751879699250897 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 41.960000000000036, + "referenceP95Ms": 46.23000000000138, + "referenceGpuMs": 43.20000000000073, + "referenceOverFrameBudget": true, + "competitorMs": 21.404999999998836, + "competitorP95Ms": 25.19999999999709, + "competitorGpuMs": 22.760000000009313, + "competitorOverFrameBudget": true, "verdict": { "side": "neither", "ratio": null, @@ -1735,73 +1686,106 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", + "timer": "resolved", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 0.07999999999810825, - "maxMs": 0.08000000000174623, - "ratio": 1.0000000000454747 + "minMs": 41.06999999999971, + "maxMs": 42.850000000000364, + "ratio": 1.0433406379352488 }, "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.09999999999854481, - "ratio": 1.2499999999545253 + "minMs": 20.60000000000582, + "maxMs": 22.20999999999185, + "ratio": 1.078155339805125 }, "stable": false, "rungs": [ - "exojs-leads", - "level", - "level" + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 42.850000000000364, + "referenceP95Ms": 45.92000000000189, + "referenceGpuMs": 44.36000000000058, + "referenceOverFrameBudget": true, + "competitorMs": 29.0099999999984, + "competitorP95Ms": 32.780000000002474, + "competitorGpuMs": 30.69999999999709, + "competitorOverFrameBudget": true, + "verdict": { + "side": "competitor", + "ratio": 1.4770768700449062, + "factor": 1.4770768700449062, + "label": "competitor leads (1.48x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 41.06999999999971, + "maxMs": 43.340000000000146, + "ratio": 1.055271487703931 + }, + "competitor": { + "minMs": 27.399999999999636, + "maxMs": 29.219999999999345, + "ratio": 1.066423357664224 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] - } - ] - }, - { - "title": "Text", - "rows": [ + }, { - "archetype": "text-static", - "category": "Text", + "archetype": "deep-hierarchy", + "category": "Node scaling", "count": 1000, "loadId": "1k", - "unit": "labels", - "primary": true, + "unit": "nodes", + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.09999999999854481, - "referenceP95Ms": 0.2000000000007276, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.26000000000203727, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 6.540000000004511, - "competitorP95Ms": 8.700000000004366, + "competitorMs": 3.0900000000037835, + "competitorP95Ms": 6.139999999999418, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.015290519877442788, - "factor": 65.40000000099681, - "label": "ExoJS leads clearly (65.40x)", + "ratio": 0.05825242718448888, + "factor": 17.166666666659932, + "label": "ExoJS leads clearly (17.17x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.10000000000218279, - "ratio": 1.0000000000363798 + "minMs": 0.18000000000029104, + "maxMs": 0.18000000000029104, + "ratio": 1 }, "competitor": { - "minMs": 6.389999999999418, - "maxMs": 6.809999999997672, - "ratio": 1.0657276995302492 + "minMs": 2.9199999999982538, + "maxMs": 3.1600000000034925, + "ratio": 1.082191780823761 }, "stable": true, "rungs": [ @@ -1813,34 +1797,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.09999999999854481, - "referenceP95Ms": 0.2000000000007276, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.26000000000203727, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.899999999999636, - "competitorP95Ms": 4.040000000000873, - "competitorGpuMs": 16.660000000001673, + "competitorMs": 1, + "competitorP95Ms": 1.3999999999941792, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.03448275862019219, - "factor": 29.000000000418368, - "label": "ExoJS leads clearly (29.00x)", + "ratio": 0.18000000000029104, + "factor": 5.555555555546573, + "label": "ExoJS leads clearly (5.56x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.10000000000218279, - "ratio": 1.0000000000363798 + "minMs": 0.18000000000029104, + "maxMs": 0.18000000000029104, + "ratio": 1 }, "competitor": { - "minMs": 2.880000000000109, - "maxMs": 3.0599999999994907, - "ratio": 1.0624999999997828 + "minMs": 0.9799999999813735, + "maxMs": 1.2599999999998772, + "ratio": 1.2857142857385975 }, "stable": true, "rungs": [ @@ -1852,13 +1836,13 @@ }, { "competitor": "pixi", - "referenceMs": 0.09999999999854481, - "referenceP95Ms": 0.2000000000007276, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.26000000000203727, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.10000000000218279, - "competitorP95Ms": 0.2000000000007276, - "competitorGpuMs": 16.679999999996653, + "competitorMs": 0.2400000000016007, + "competitorP95Ms": 0.3600000000005821, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -1867,24 +1851,24 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.10000000000218279, - "ratio": 1.0000000000363798 + "minMs": 0.18000000000029104, + "maxMs": 0.18000000000029104, + "ratio": 1 }, "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.10000000000218279, - "ratio": 1.25 + "minMs": 0.2000000000007276, + "maxMs": 0.2599999999983993, + "ratio": 1.2999999999872671 }, "stable": false, "rungs": [ - "level", - "competitor-leads", + "exojs-leads", + "exojs-leads", "level" ] } @@ -1892,43 +1876,43 @@ ] }, { - "archetype": "text-static", - "category": "Text", + "archetype": "deep-hierarchy", + "category": "Node scaling", "count": 5000, "loadId": "5k", - "unit": "labels", + "unit": "nodes", "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.09000000000014552, - "referenceP95Ms": 0.18000000000029104, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.36999999999898137, + "referenceP95Ms": 0.5, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 33, - "competitorP95Ms": 36.900000000001455, - "competitorGpuMs": 34.62000000000262, - "competitorOverFrameBudget": true, + "competitorMs": 11.930000000007567, + "competitorP95Ms": 15.799999999988358, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.002727272727277137, - "factor": 366.6666666660738, - "label": "ExoJS leads clearly (366.67x)", + "ratio": 0.0310142497903392, + "factor": 32.24324324335247, + "label": "ExoJS leads clearly (32.24x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09000000000014552, - "maxMs": 0.09999999999854481, - "ratio": 1.1111111110931458 + "minMs": 0.3400000000001455, + "maxMs": 0.38000000000101863, + "ratio": 1.117647058826047 }, "competitor": { - "minMs": 32.11000000000058, - "maxMs": 33.44999999999709, - "ratio": 1.0417315478043128 + "minMs": 11.690000000002328, + "maxMs": 13.339999999996508, + "ratio": 1.1411462788703037 }, "stable": true, "rungs": [ @@ -1940,34 +1924,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.09000000000014552, - "referenceP95Ms": 0.18000000000029104, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.36999999999898137, + "referenceP95Ms": 0.5, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 6.469999999999345, - "competitorP95Ms": 8, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 2.759999999999991, + "competitorP95Ms": 5.959999999991851, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.013910355486886341, - "factor": 71.88888888876538, - "label": "ExoJS leads clearly (71.89x)", + "ratio": 0.13405797101412412, + "factor": 7.459459459479972, + "label": "ExoJS leads clearly (7.46x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09000000000014552, - "maxMs": 0.09999999999854481, - "ratio": 1.1111111110931458 + "minMs": 0.3400000000001455, + "maxMs": 0.38000000000101863, + "ratio": 1.117647058826047 }, "competitor": { - "minMs": 6.440000000000509, - "maxMs": 6.619999999998981, - "ratio": 1.0279503105587668 + "minMs": 2.6699999999982538, + "maxMs": 3.220000000001164, + "ratio": 1.2059925093645207 }, "stable": true, "rungs": [ @@ -1979,34 +1963,34 @@ }, { "competitor": "pixi", - "referenceMs": 0.09000000000014552, - "referenceP95Ms": 0.18000000000029104, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.36999999999898137, + "referenceP95Ms": 0.5, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999854481, - "competitorP95Ms": 0.2000000000007276, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.3999999999978172, + "competitorP95Ms": 0.5200000000004366, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.9000000000145519, + "ratio": 0.9250000000025012, "factor": 1, "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.09000000000014552, - "maxMs": 0.09999999999854481, - "ratio": 1.1111111110931458 + "minMs": 0.3400000000001455, + "maxMs": 0.38000000000101863, + "ratio": 1.117647058826047 }, "competitor": { - "minMs": 0.09999999999854481, - "maxMs": 0.09999999999854481, - "ratio": 1 + "minMs": 0.3400000000001455, + "maxMs": 0.4000000000014552, + "ratio": 1.1764705882390705 }, "stable": true, "rungs": [ @@ -2019,449 +2003,423 @@ ] }, { - "archetype": "text-dynamic", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "nodes", "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 2.5799999999999272, - "referenceP95Ms": 5.259999999998399, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.5200000000004366, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 6.729999999999563, - "competitorP95Ms": 9.159999999996217, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 31.889999999999418, + "competitorP95Ms": 37.679999999993015, + "competitorGpuMs": 33.120000000009895, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.38335809806836474, - "factor": 2.60852713178285, - "label": "ExoJS leads (2.61x)", - "structural": false + "ratio": 0.01630605205394939, + "factor": 61.326923076870465, + "label": "ExoJS leads clearly (61.33x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.5200000000004366, - "maxMs": 2.7000000000007276, - "ratio": 1.0714285714286746 + "minMs": 0.5100000000002183, + "maxMs": 0.5399999999990541, + "ratio": 1.0588235294094568 }, "competitor": { - "minMs": 5.6599999999962165, - "maxMs": 7.030000000002474, - "ratio": 1.2420494699659317 + "minMs": 31.299999999995634, + "maxMs": 32.220000000001164, + "ratio": 1.0293929712461871 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "phaser", - "referenceMs": 2.5799999999999272, - "referenceP95Ms": 5.259999999998399, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.5200000000004366, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 2.980000000000473, - "competitorP95Ms": 5.239999999999782, - "competitorGpuMs": 16.679999999998472, + "competitorMs": 3.220000000001164, + "competitorP95Ms": 8.319999999999709, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.8657718120803751, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.16149068322989085, + "factor": 6.192307692304732, + "label": "ExoJS leads clearly (6.19x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.5200000000004366, - "maxMs": 2.7000000000007276, - "ratio": 1.0714285714286746 + "minMs": 0.5100000000002183, + "maxMs": 0.5399999999990541, + "ratio": 1.0588235294094568 }, "competitor": { - "minMs": 2.9799999999995634, - "maxMs": 3.0100000000002183, - "ratio": 1.010067114094181 + "minMs": 3.139999999999418, + "maxMs": 3.3700000000003456, + "ratio": 1.073248407643621 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 2.5799999999999272, - "referenceP95Ms": 5.259999999998399, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.5200000000004366, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 4.259999999998399, - "competitorP95Ms": 5.899999999997817, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.5499999999992724, + "competitorP95Ms": 0.7000000000007276, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.6056338028171119, - "factor": 1.6511627906971007, - "label": "ExoJS leads (1.65x)", + "side": "neither", + "ratio": 0.9454545454565899, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.5200000000004366, - "maxMs": 2.7000000000007276, - "ratio": 1.0714285714286746 + "minMs": 0.5100000000002183, + "maxMs": 0.5399999999990541, + "ratio": 1.0588235294094568 }, "competitor": { - "minMs": 4.170000000000073, - "maxMs": 4.479999999999563, - "ratio": 1.0743405275778142 + "minMs": 0.5200000000004366, + "maxMs": 0.5900000000001455, + "ratio": 1.134615384614712 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } } ] }, { - "archetype": "text-dynamic", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "nodes", "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 7.210000000000946, - "referenceP95Ms": 9.400000000001455, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.9199999999982538, + "referenceP95Ms": 1.2199999999975262, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 32.25999999999476, - "competitorP95Ms": 39.5199999999968, - "competitorGpuMs": 33.76000000000931, + "competitorMs": 86.26000000000204, + "competitorP95Ms": 94.22000000000116, + "competitorGpuMs": 88.63999999999942, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.22349659020465334, - "factor": 4.474341192786481, - "label": "ExoJS leads (4.47x)", - "structural": false + "ratio": 0.010665430095040946, + "factor": 93.76086956539758, + "label": "ExoJS leads clearly (93.76x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 7.039999999999054, - "maxMs": 7.280000000000655, - "ratio": 1.034090909091141 + "minMs": 0.8999999999996362, + "maxMs": 0.9200000000018917, + "ratio": 1.0222222222247375 }, "competitor": { - "minMs": 28.43000000000393, - "maxMs": 34.93000000000029, - "ratio": 1.2286317270487324 + "minMs": 84.66999999999098, + "maxMs": 90.70000000001164, + "ratio": 1.0712176685959762 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "phaser", - "referenceMs": 7.210000000000946, - "referenceP95Ms": 9.400000000001455, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.9199999999982538, + "referenceP95Ms": 1.2199999999975262, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 6.579999999999927, - "competitorP95Ms": 8.1200000000008, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 5.299999999999727, + "competitorP95Ms": 7, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1.0957446808512197, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.17358490566005683, + "factor": 5.760869565228029, + "label": "ExoJS leads clearly (5.76x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 7.039999999999054, - "maxMs": 7.280000000000655, - "ratio": 1.034090909091141 + "minMs": 0.8999999999996362, + "maxMs": 0.9200000000018917, + "ratio": 1.0222222222247375 }, "competitor": { - "minMs": 6.509999999999309, - "maxMs": 6.9099999999998545, - "ratio": 1.0614439324117646 + "minMs": 5.260000000009313, + "maxMs": 5.499999999985448, + "ratio": 1.0456273764212376 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 7.210000000000946, - "referenceP95Ms": 9.400000000001455, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.9199999999982538, + "referenceP95Ms": 1.2199999999975262, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 18.7400000000016, - "competitorP95Ms": 21.780000000002474, - "competitorGpuMs": 20.279999999998836, - "competitorOverFrameBudget": true, + "competitorMs": 1.0200000000004366, + "competitorP95Ms": 1.3999999999978172, + "competitorGpuMs": 16.68000000000029, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.384738527214532, - "factor": 2.5991678224686745, - "label": "ExoJS leads (2.60x)", + "side": "neither", + "ratio": 0.9019607843116275, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 7.039999999999054, - "maxMs": 7.280000000000655, - "ratio": 1.034090909091141 + "minMs": 0.8999999999996362, + "maxMs": 0.9200000000018917, + "ratio": 1.0222222222247375 }, "competitor": { - "minMs": 18.530000000002474, - "maxMs": 18.920000000000073, - "ratio": 1.0210469508903155 + "minMs": 1, + "maxMs": 1.0899999999983265, + "ratio": 1.0899999999983265 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } } ] - } - ] - }, - { - "title": "Render targets", - "rows": [ + }, { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "nodes", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.3999999999978172, - "referenceP95Ms": 0.6999999999970896, - "referenceGpuMs": 16.660000000003492, + "competitor": "phaser", + "referenceMs": 1.0849999999991269, + "referenceP95Ms": 2.710000000000946, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 2.2299999999977445, - "competitorP95Ms": 3.819999999999709, - "competitorGpuMs": 16.68000000000029, - "competitorOverFrameBudget": false, + "competitorMs": 24.455000000009022, + "competitorP95Ms": 28.30999999998312, + "competitorGpuMs": 25.339999999981956, + "competitorOverFrameBudget": true, "verdict": { - "side": "exojs", - "ratio": 0.17937219730861964, - "factor": 5.575000000024784, - "label": "ExoJS leads clearly (5.58x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", "timer": "resolved", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 0.3499999999985448, - "maxMs": 0.41999999999825377, - "ratio": 1.2 + "minMs": 1.0499999999992724, + "maxMs": 1.1199999999989814, + "ratio": 1.0666666666664357 }, "competitor": { - "minMs": 2.210000000000946, - "maxMs": 2.25, - "ratio": 1.0180995475108765 + "minMs": 22.980000000010477, + "maxMs": 25.930000000007567, + "ratio": 1.1283724978240097 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", "exojs-leads-clearly", "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.3000000000029104, - "referenceP95Ms": 0.5199999999967986, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 1.0499999999992724, + "referenceP95Ms": 3.3000000000029104, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 2.3400000000001455, - "competitorP95Ms": 4.639999999999418, + "competitorMs": 1.250000000001819, + "competitorP95Ms": 2.9199999999982538, "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.12820512820636398, - "factor": 7.7999999999248155, - "label": "ExoJS leads clearly (7.80x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3000000000029104, - "maxMs": 0.31999999999970896, - "ratio": 1.0666666666553486 + "minMs": 0.9699999999993452, + "maxMs": 1.1199999999989814, + "ratio": 1.1546391752574614 }, "competitor": { - "minMs": 2.2399999999997817, - "maxMs": 2.540000000002692, - "ratio": 1.1339285714298837 + "minMs": 1.069999999999709, + "maxMs": 1.320000000001528, + "ratio": 1.2336448598148477 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "exojs-leads" ] } } ] }, { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "nodes", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.2800000000061118, - "referenceP95Ms": 0.4599999999991269, + "competitor": "excalibur", + "referenceMs": 1.3800000000046566, + "referenceP95Ms": 2.320000000006985, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 2.5099999999983993, - "competitorP95Ms": 4.540000000000873, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 4.80000000000291, + "competitorP95Ms": 5.959999999991851, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.11155378486306389, - "factor": 8.964285714084326, - "label": "ExoJS leads clearly (8.96x)", - "structural": true + "ratio": 0.2875000000007958, + "factor": 3.47826086955559, + "label": "ExoJS leads (3.48x)", + "structural": false }, - "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.2800000000024738, - "maxMs": 0.3100000000013097, - "ratio": 1.1071428571377528 + "minMs": 1.3099999999976717, + "maxMs": 1.6300000000046566, + "ratio": 1.2442748091660716 }, "competitor": { - "minMs": 2.4199999999982538, - "maxMs": 2.529999999998836, - "ratio": 1.0454545454548188 + "minMs": 4.80000000000291, + "maxMs": 4.870000000002619, + "ratio": 1.014583333333264 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.31999999999970896, - "referenceP95Ms": 0.5200000000040745, - "referenceGpuMs": 16.68000000000029, + "competitor": "phaser", + "referenceMs": 1.3800000000046566, + "referenceP95Ms": 2.320000000006985, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.47000000000116415, - "competitorP95Ms": 0.6999999999970896, + "competitorMs": 2.3399999999674037, + "competitorP95Ms": 3.1600000000034925, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.6808510638274816, - "factor": 1.4687500000049738, - "label": "ExoJS leads (1.47x)", + "ratio": 0.5897435897537949, + "factor": 1.6956521738837012, + "label": "ExoJS leads (1.70x)", "structural": false }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3099999999976717, - "maxMs": 0.3400000000001455, - "ratio": 1.096774193557094 + "minMs": 1.3099999999976717, + "maxMs": 1.6300000000046566, + "ratio": 1.2442748091660716 }, "competitor": { - "minMs": 0.4400000000023283, - "maxMs": 0.47000000000116415, - "ratio": 1.0681818181788116 + "minMs": 2.290000000008149, + "maxMs": 2.3699999999989814, + "ratio": 1.0349344978124662 }, "stable": true, "rungs": [ @@ -2470,146 +2428,125 @@ "exojs-leads" ] } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.2599999999983993, - "referenceP95Ms": 0.4400000000023283, + "referenceMs": 1.3800000000046566, + "referenceP95Ms": 2.320000000006985, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.27999999999883585, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 1.5399999999935972, + "competitorP95Ms": 2.319999999992433, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.8571428571391448, - "factor": 1.8571428571391448, - "label": "competitor leads (1.86x)", + "side": "neither", + "ratio": 0.8961038961106456, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "limited", - "aggregate": { + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { "runs": 3, "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.26000000000203727, - "ratio": 1.1818181818211884 + "minMs": 1.3099999999976717, + "maxMs": 1.6300000000046566, + "ratio": 1.2442748091660716 }, "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.1599999999962165, - "ratio": 1.1428571428348695 + "minMs": 1.4799999999959255, + "maxMs": 1.5500000000029104, + "ratio": 1.047297297302147 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "level", + "level", + "level" ] } } ] }, { - "archetype": "fx-blur", - "category": "Render targets", - "count": 720, - "loadId": "720", - "unit": "viewport", + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "nodes", "primary": true, - "label": "1280 x 720", "cells": [ { - "competitor": "pixi", - "referenceMs": 0.2800000000061118, - "referenceP95Ms": 0.4800000000032014, - "referenceGpuMs": 16.68000000000029, + "competitor": "excalibur", + "referenceMs": 3.1899999999877764, + "referenceP95Ms": 6.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.26000000000203727, - "competitorP95Ms": 0.4599999999991269, - "competitorGpuMs": 16.68000000000029, - "competitorOverFrameBudget": false, + "competitorMs": 22.879999999990105, + "competitorP95Ms": 24.94000000000233, + "competitorGpuMs": 23.74000000000524, + "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": 1.0769230769381455, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.13942307692260297, + "factor": 7.17241379312783, + "label": "ExoJS leads clearly (7.17x)", + "structural": true }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.2800000000061118, - "ratio": 1.0000000000259857 + "minMs": 3.0100000000093132, + "maxMs": 3.5199999999895226, + "ratio": 1.1694352159397448 }, "competitor": { - "minMs": 0.26000000000203727, - "maxMs": 0.26000000000203727, - "ratio": 1 + "minMs": 22.34999999999127, + "maxMs": 23.620000000009895, + "ratio": 1.056823266220095 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.2800000000024738, - "referenceP95Ms": 0.4800000000032014, + "competitor": "phaser", + "referenceMs": 3.1899999999877764, + "referenceP95Ms": 6.5, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.38000000000101863, - "competitorP95Ms": 0.5800000000017462, + "competitorMs": 10.709999999991851, + "competitorP95Ms": 11.220000000001164, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.7368421052676928, - "factor": 1.3571428571345046, - "label": "ExoJS leads (1.36x)", + "ratio": 0.29785247432214784, + "factor": 3.3573667711701853, + "label": "ExoJS leads (3.36x)", "structural": false }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.27000000000043656, - "maxMs": 0.2999999999956344, - "ratio": 1.1111111110931458 + "minMs": 3.0100000000093132, + "maxMs": 3.5199999999895226, + "ratio": 1.1694352159397448 }, "competitor": { - "minMs": 0.37999999999738066, - "maxMs": 0.4000000000014552, - "ratio": 1.0526315789584537 + "minMs": 10.350000000002183, + "maxMs": 10.779999999969732, + "ratio": 1.0415458937166626 }, "stable": true, "rungs": [ @@ -2618,52 +2555,37 @@ "exojs-leads" ] } - } - ] - } - ] - }, - { - "title": "Camera and world", - "rows": [ - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 1.4600000000027649, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 3.1899999999877764, + "referenceP95Ms": 6.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.11000000000058208, - "competitorP95Ms": 0.22000000000116415, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 2.3999999999941792, + "competitorP95Ms": 8.279999999998836, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.6363636363576233, - "factor": 1.6363636363576233, - "label": "competitor leads (1.64x)", + "ratio": 1.3291666666647972, + "factor": 1.3291666666647972, + "label": "competitor leads (1.33x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.2000000000007276, - "ratio": 1.1111111111133567 + "minMs": 3.0100000000093132, + "maxMs": 3.5199999999895226, + "ratio": 1.1694352159397448 }, "competitor": { - "minMs": 0.1000000000003638, - "maxMs": 0.11999999999898137, - "ratio": 1.199999999985448 + "minMs": 2.389999999999418, + "maxMs": 2.4499999999970896, + "ratio": 1.025104602509492 }, "stable": true, "rungs": [ @@ -2674,676 +2596,692 @@ } } ] - } - ] - }, - { - "title": "Tilemaps", - "rows": [ + }, { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "nodes", "primary": false, "cells": [ { - "competitor": "phaser", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 1.1999999999970896, + "competitor": "excalibur", + "referenceMs": 12.830000000001746, + "referenceP95Ms": 15.119999999995343, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.2000000000007276, - "competitorP95Ms": 0.3999999999978172, - "competitorGpuMs": 16.68000000000029, - "competitorOverFrameBudget": false, + "competitorMs": 155.8000000000029, + "competitorP95Ms": 161.2599999999802, + "competitorGpuMs": 158.8399999999965, + "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": 0.899999999998181, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.0823491655969288, + "factor": 12.14341387373201, + "label": "ExoJS leads clearly (12.14x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110931458 + "minMs": 12.660000000003492, + "maxMs": 13.610000000000582, + "ratio": 1.0750394944705235 }, "competitor": { - "minMs": 0.2000000000007276, - "maxMs": 0.22000000000116415, - "ratio": 1.100000000001819 + "minMs": 154.82000000000698, + "maxMs": 163.2400000000198, + "ratio": 1.0543857382767887 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 1.1999999999970896, + "referenceMs": 12.830000000001746, + "referenceP95Ms": 15.119999999995343, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.22000000000116415, - "competitorP95Ms": 0.37999999999738066, + "competitorMs": 10.419999999998254, + "competitorP95Ms": 13.319999999992433, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.8181818181788116, - "factor": 1, - "label": "level", + "side": "competitor", + "ratio": 1.2312859884840592, + "factor": 1.2312859884840592, + "label": "competitor leads (1.23x)", "structural": false }, - "mechanism": "ExoJS issues fewer draw calls (90 vs 282 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110931458 + "minMs": 12.660000000003492, + "maxMs": 13.610000000000582, + "ratio": 1.0750394944705235 }, "competitor": { - "minMs": 0.19999999999708962, - "maxMs": 0.23999999999796273, - "ratio": 1.200000000007276 + "minMs": 10.37000000000262, + "maxMs": 10.580000000001746, + "ratio": 1.0202507232400264 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] - }, + } + ] + }, + { + "title": "Fill and GPU state", + "rows": [ { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 1000, + "loadId": "1k", + "unit": "nodes", + "primary": false, "cells": [ { - "competitor": "phaser", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.819999999999709, - "referenceGpuMs": 16.660000000003492, + "competitor": "excalibur", + "referenceMs": 0.06000000000130967, + "referenceP95Ms": 0.10000000000218279, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.2999999999992724, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 1.8000000000029104, + "competitorP95Ms": 3.9800000000104774, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.7777777777732865, - "factor": 1.28571428572171, - "label": "ExoJS leads (1.29x)", - "structural": false + "ratio": 0.03333333333400703, + "factor": 29.999999999393673, + "label": "ExoJS leads clearly (30.00x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.11999999999534339, - "maxMs": 0.13999999999941792, - "ratio": 1.1666666667070886 + "minMs": 0.06000000000130967, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333332727004 }, "competitor": { - "minMs": 0.1499999999996362, - "maxMs": 0.18000000000029104, - "ratio": 1.2000000000048507 + "minMs": 1.5900000000037835, + "maxMs": 1.8099999999976717, + "ratio": 1.1383647798700407 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.819999999999709, - "referenceGpuMs": 16.660000000003492, + "competitor": "phaser", + "referenceMs": 0.06000000000130967, + "referenceP95Ms": 0.10000000000218279, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.3600000000005821, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 1.2399999999906868, + "competitorP95Ms": 1.5599999999976717, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.7777777777732865, - "factor": 1.28571428572171, - "label": "ExoJS leads (1.29x)", - "structural": false + "ratio": 0.048387096775613155, + "factor": 20.666666666060337, + "label": "ExoJS leads clearly (20.67x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (30 vs 2 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.11999999999534339, - "maxMs": 0.13999999999941792, - "ratio": 1.1666666667070886 + "minMs": 0.06000000000130967, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333332727004 }, "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.21999999999752617, - "ratio": 1.2222222222065025 + "minMs": 1.1999999999825377, + "maxMs": 1.3199999999999932, + "ratio": 1.1000000000160015 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ + }, { - "competitor": "phaser", - "referenceMs": 0.6699999999982538, - "referenceP95Ms": 1.319999999999709, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.06000000000130967, + "referenceP95Ms": 0.10000000000218279, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.9600000000009459, - "competitorP95Ms": 6.520000000000437, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.2000000000007276, + "competitorGpuMs": 16.679999999996653, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.34183673469282166, - "factor": 2.925373134337394, - "label": "ExoJS leads (2.93x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.63999999999578, - "maxMs": 0.6899999999986903, - "ratio": 1.0781250000050626 + "minMs": 0.06000000000130967, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333332727004 }, "competitor": { - "minMs": 1.3800000000010186, - "maxMs": 2.600000000000364, - "ratio": 1.8840579710133656 + "minMs": 0.06000000000130967, + "maxMs": 0.09999999999854481, + "ratio": 1.6666666666060337 }, - "stable": true, + "stable": false, "rungs": [ "exojs-leads", "exojs-leads", - "exojs-leads" + "level" ] } - }, - { - "competitor": "pixi", - "referenceMs": 0.6699999999982538, - "referenceP95Ms": 1.319999999999709, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 1.0100000000020373, - "competitorP95Ms": 1.9000000000014552, - "competitorGpuMs": 16.660000000003492, + } + ] + }, + { + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "excalibur", + "referenceMs": 0.020000000000436557, + "referenceP95Ms": 0.040000000000873115, + "referenceGpuMs": 47.659999999999854, + "referenceOverFrameBudget": false, + "competitorMs": 12.97000000000844, + "competitorP95Ms": 14.940000000002328, + "competitorGpuMs": 60.69999999999709, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.001542020046293257, + "factor": 648.4999999862666, + "label": "ExoJS leads clearly (648.50x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.63999999999578, - "maxMs": 0.6899999999986903, - "ratio": 1.0781250000050626 + "minMs": 0.020000000000436557, + "maxMs": 0.020000000000436557, + "ratio": 1 }, "competitor": { - "minMs": 0.7400000000016007, - "maxMs": 1.0600000000013097, - "ratio": 1.4324324324311037 + "minMs": 11.509999999994761, + "maxMs": 13.769999999996799, + "ratio": 1.1963509991314567 }, - "stable": false, + "stable": true, "rungs": [ - "level", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - } - ] - }, - { - "title": "Particles", - "rows": [ - { - "archetype": "particles-draw", - "category": "Particles", - "count": 1000, - "loadId": "1k", - "unit": "particles", - "primary": false, - "cells": [ + }, { "competitor": "phaser", - "referenceMs": 0.26000000000203727, - "referenceP95Ms": 0.41999999999825377, - "referenceGpuMs": 16.679999999993015, + "referenceMs": 0.020000000000436557, + "referenceP95Ms": 0.040000000000873115, + "referenceGpuMs": 47.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.8500000000003638, - "competitorP95Ms": 1.0800000000017462, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.9000000000232831, + "competitorP95Ms": 1.0599999999976717, + "competitorGpuMs": 38.70000000001164, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.30588235294344235, - "factor": 3.2692307692065516, - "label": "ExoJS leads (3.27x)", - "structural": false + "ratio": 0.022222222222132396, + "factor": 45.0000000001819, + "label": "ExoJS leads clearly (45.00x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.26000000000203727, - "maxMs": 0.27999999999883585, - "ratio": 1.076923076910161 + "minMs": 0.020000000000436557, + "maxMs": 0.020000000000436557, + "ratio": 1 }, "competitor": { - "minMs": 0.819999999999709, - "maxMs": 0.8600000000005821, - "ratio": 1.0487804878059601 + "minMs": 0.7699999999999818, + "maxMs": 0.9199999999837019, + "ratio": 1.1948051947840566 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 0.26000000000203727, - "referenceP95Ms": 0.41999999999825377, - "referenceGpuMs": 16.679999999993015, + "referenceMs": 0.020000000000436557, + "referenceP95Ms": 0.040000000000873115, + "referenceGpuMs": 47.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.2800000000061118, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.020000000000436557, + "competitorP95Ms": 0.059999999997671694, + "competitorGpuMs": 32.599999999998545, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.8571428571651305, - "factor": 1.8571428571651305, - "label": "competitor leads (1.86x)", + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.26000000000203727, - "maxMs": 0.27999999999883585, - "ratio": 1.076923076910161 + "minMs": 0.020000000000436557, + "maxMs": 0.020000000000436557, + "ratio": 1 }, "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.13999999999941792, + "minMs": 0.020000000000436557, + "maxMs": 0.020000000000436557, "ratio": 1 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "level", + "level", + "level" ] } } ] }, { - "archetype": "particles-draw", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", + "unit": "nodes", + "primary": false, "cells": [ { - "competitor": "phaser", - "referenceMs": 0.47999999999592546, - "referenceP95Ms": 0.5800000000017462, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.049999999999272404, + "referenceP95Ms": 0.09999999999854481, + "referenceGpuMs": 238.20000000000437, "referenceOverFrameBudget": false, - "competitorMs": 2.680000000000291, - "competitorP95Ms": 3.7599999999983993, - "competitorGpuMs": 16.679999999996653, + "competitorMs": 0.059999999997671694, + "competitorP95Ms": 0.09999999999854481, + "competitorGpuMs": 162.94000000000233, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.1791044776104005, - "factor": 5.583333333381335, - "label": "ExoJS leads clearly (5.58x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "competitor issues fewer draw calls (420 vs 1 per frame)", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.46000000000276486, - "maxMs": 0.47999999999592546, - "ratio": 1.0434782608544357 + "minMs": 0.040000000000873115, + "maxMs": 0.059999999997671694, + "ratio": 1.4999999999090505 }, "competitor": { - "minMs": 2.5500000000010914, - "maxMs": 3.0799999999999272, - "ratio": 1.2078431372543565 + "minMs": 0.040000000000873115, + "maxMs": 0.06000000000130967, + "ratio": 1.5 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "exojs-leads", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 8, + "loadId": "8", + "unit": "layers", + "primary": false, + "cells": [ { - "competitor": "pixi", - "referenceMs": 0.47999999999592546, - "referenceP95Ms": 0.5800000000017462, + "competitor": "excalibur", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.09999999999854481, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.12000000000261934, - "competitorP95Ms": 0.2400000000052387, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.5400000000081491, + "competitorP95Ms": 0.8000000000029104, + "competitorGpuMs": 16.680000000007567, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 3.999999999878734, - "factor": 3.999999999878734, - "label": "competitor leads (4.00x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { - "runs": 3, + "runs": 1, "reference": { - "minMs": 0.46000000000276486, - "maxMs": 0.47999999999592546, - "ratio": 1.0434782608544357 + "minMs": 0.06000000000494765, + "maxMs": 0.06000000000494765, + "ratio": 1 }, "competitor": { - "minMs": 0.12000000000261934, - "maxMs": 0.12000000000261934, + "minMs": 0.5400000000081491, + "maxMs": 0.5400000000081491, "ratio": 1 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ + }, { - "competitor": "phaser", - "referenceMs": 1.7900000000008731, - "referenceP95Ms": 2.6199999999953434, + "competitor": "pixi", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.09999999999854481, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 9.460000000000946, - "competitorP95Ms": 10.020000000000437, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.1892177589852742, - "factor": 5.284916201115269, - "label": "ExoJS leads clearly (5.28x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.7899999999972351, - "maxMs": 1.860000000000582, - "ratio": 1.0391061452533268 + "minMs": 0.059999999997671694, + "maxMs": 0.06000000000494765, + "ratio": 1.0000000001212659 }, "competitor": { - "minMs": 9.459999999999127, - "maxMs": 9.570000000001528, - "ratio": 1.0116279069769991 + "minMs": 0.06000000000494765, + "maxMs": 0.09999999999854481, + "ratio": 1.6666666665049787 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "level" ] } }, { - "competitor": "pixi", - "referenceMs": 1.7900000000008731, - "referenceP95Ms": 2.6199999999953434, - "referenceGpuMs": 16.660000000003492, + "competitor": "phaser", + "referenceMs": 0.06000000000130967, + "referenceP95Ms": 0.10000000000218279, + "referenceGpuMs": 16.669999999998254, "referenceOverFrameBudget": false, - "competitorMs": 0.1499999999978172, - "competitorP95Ms": 0.2999999999956344, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.16999999999643478, + "competitorP95Ms": 0.3599999999823922, + "competitorGpuMs": 16.670000000016444, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 11.933333333512808, - "factor": 11.933333333512808, - "label": "competitor leads clearly (11.93x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 1.7899999999972351, - "maxMs": 1.860000000000582, - "ratio": 1.0391061452533268 + "minMs": 0.059999999997671694, + "maxMs": 0.06000000000494765, + "ratio": 1.0000000001212659 }, "competitor": { - "minMs": 0.11000000000058208, - "maxMs": 0.1500000000014552, - "ratio": 1.3636363636423767 + "minMs": 0.15999999999985448, + "maxMs": 0.17999999999301508, + "ratio": 1.1249999999573674 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "exojs-leads", + "exojs-leads" ] } } ] }, { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 32, + "loadId": "32", + "unit": "layers", "primary": true, "cells": [ { - "competitor": "phaser", - "referenceMs": 1.3000000000029104, - "referenceP95Ms": 2.2399999999979627, - "referenceGpuMs": 16.660000000003492, + "competitor": "excalibur", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 3.2299999999995634, - "competitorP95Ms": 5.780000000002474, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.6199999999998909, + "competitorP95Ms": 0.9400000000000546, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.40247678018671396, - "factor": 2.4846153846094863, - "label": "ExoJS leads (2.48x)", - "structural": false + "ratio": 0.09677419355638421, + "factor": 10.33333333247942, + "label": "ExoJS leads clearly (10.33x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.2300000000032014, - "maxMs": 1.6500000000014552, - "ratio": 1.3414634146318378 + "minMs": 0.059999999997671694, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333333535444 }, "competitor": { - "minMs": 3.0600000000013097, - "maxMs": 3.2699999999986176, - "ratio": 1.068627450979483 + "minMs": 0.6199999999953434, + "maxMs": 0.6599999999998545, + "ratio": 1.0645161290400187 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { - "competitor": "pixi", - "referenceMs": 1.3000000000029104, - "referenceP95Ms": 2.2399999999979627, - "referenceGpuMs": 16.660000000003492, + "competitor": "phaser", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 1, - "competitorP95Ms": 1.2800000000061118, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.21999999997206032, + "competitorP95Ms": 0.40000000002328306, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.3000000000029104, - "factor": 1.3000000000029104, - "label": "competitor leads (1.30x)", + "side": "exojs", + "ratio": 0.272727272784398, + "factor": 3.666666665898649, + "label": "ExoJS leads (3.67x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.2300000000032014, - "maxMs": 1.6500000000014552, - "ratio": 1.3414634146318378 + "minMs": 0.059999999997671694, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333333535444 }, "competitor": { - "minMs": 0.9000000000014552, - "maxMs": 1.0199999999967986, - "ratio": 1.1333333333279438 + "minMs": 0.1999999999989086, + "maxMs": 0.24000000004889444, + "ratio": 1.2000000002510205 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.68000000000029, + "referenceOverFrameBudget": false, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.059999999997671694, + "maxMs": 0.07999999999810825, + "ratio": 1.3333333333535444 + }, + "competitor": { + "minMs": 0.059999999997671694, + "maxMs": 0.09999999999854481, + "ratio": 1.6666666667070886 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "exojs-leads", + "level" ] } } ] - } - ] - }, - { - "title": "Interaction", - "rows": [ + }, { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 10000, - "loadId": "10k", - "unit": "rects", - "primary": true, + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 128, + "loadId": "128", + "unit": "layers", + "primary": false, "cells": [ { - "competitor": "phaser", - "referenceMs": 0.5600000000049477, - "referenceP95Ms": 0.8799999999973807, - "referenceGpuMs": 16.68000000000029, + "competitor": "excalibur", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.09999999999854481, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 32.44000000000233, - "competitorP95Ms": 35.44000000000233, - "competitorGpuMs": 33.31999999999971, - "competitorOverFrameBudget": true, + "competitorMs": 0.9499999999995907, + "competitorP95Ms": 1.3600000000001273, + "competitorGpuMs": 16.659999999999854, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.01726263871778383, - "factor": 57.92857142806378, - "label": "ExoJS leads clearly (57.93x)", + "ratio": 0.06315789474207736, + "factor": 15.833333332020883, + "label": "ExoJS leads clearly (15.83x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5600000000013097, - "maxMs": 0.5999999999985448, - "ratio": 1.071428571423467 + "minMs": 0.059999999997671694, + "maxMs": 0.06000000000494765, + "ratio": 1.0000000001212659 }, "competitor": { - "minMs": 32.279999999998836, - "maxMs": 32.61999999999898, - "ratio": 1.010532837670389 + "minMs": 0.8700000000003456, + "maxMs": 1.180000000000291, + "ratio": 1.3563218390802554 }, "stable": true, "rungs": [ @@ -3354,570 +3292,454 @@ } }, { - "competitor": "pixi", - "referenceMs": 0.5600000000049477, - "referenceP95Ms": 0.8799999999973807, - "referenceGpuMs": 16.68000000000029, + "competitor": "phaser", + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.09999999999854481, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 16.5, - "competitorP95Ms": 21.5, - "competitorGpuMs": 17.0199999999968, + "competitorMs": 0.3600000000442378, + "competitorP95Ms": 0.5200000000186265, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.0339393939396938, - "factor": 29.46428571402539, - "label": "ExoJS leads clearly (29.46x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5600000000013097, - "maxMs": 0.5999999999985448, - "ratio": 1.071428571423467 + "minMs": 0.059999999997671694, + "maxMs": 0.06000000000494765, + "ratio": 1.0000000001212659 }, "competitor": { - "minMs": 16.270000000000437, - "maxMs": 17.31000000000131, - "ratio": 1.063921327596856 + "minMs": 0.2999999999992724, + "maxMs": 0.3800000000046566, + "ratio": 1.2666666666852608 }, - "stable": true, + "stable": false, "rungs": [ "exojs-leads-clearly", "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads" ] } - } - ] - }, - { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "widgets", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 10.25, - "referenceP95Ms": 10.720000000001164, + "referenceMs": 0.06000000000494765, + "referenceP95Ms": 0.09999999999854481, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 48.460000000002765, - "competitorP95Ms": 52.75999999999476, - "competitorGpuMs": 49.140000000006694, - "competitorOverFrameBudget": true, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.21151465125875804, - "factor": 4.72780487804905, - "label": "ExoJS leads (4.73x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 10.220000000001164, - "maxMs": 10.340000000003783, - "ratio": 1.0117416829748147 + "minMs": 0.059999999997671694, + "maxMs": 0.06000000000494765, + "ratio": 1.0000000001212659 }, "competitor": { - "minMs": 47.99999999999636, - "maxMs": 49.04999999999927, - "ratio": 1.0218750000000623 + "minMs": 0.06000000000494765, + "maxMs": 0.09999999999854481, + "ratio": 1.6666666665049787 }, - "stable": true, + "stable": false, "rungs": [ "exojs-leads", "exojs-leads", - "exojs-leads" + "level" ] } } ] - } - ] - } - ], - "excluded": [ - { - "archetype": "overdraw", - "reason": "not measured in this run" - }, - { - "archetype": "split-screen", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "instanced-batch", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-static", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-array", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material-atlased", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - } - ], - "webgl1": [] - }, - { - "backend": "webgpu", - "headlineCount": null, - "competitors": [ - "pixi" - ], - "sections": [ - { - "title": "Node scaling", - "rows": [ + }, { - "archetype": "static-heavy", - "category": "Node scaling", + "archetype": "batch-breaking", + "category": "Fill and GPU state", "count": 1000, "loadId": "1k", "unit": "sprites", "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.2999999999999545, - "referenceP95Ms": 0.5599999999999454, - "referenceGpuMs": 0.072937, + "competitor": "excalibur", + "referenceMs": 0.6399999999994179, + "referenceP95Ms": 0.8600000000005821, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.3000000000001819, - "competitorP95Ms": 0.6000000000001364, - "competitorGpuMs": 0.073125, + "competitorMs": 3.25, + "competitorP95Ms": 6.420000000000073, + "competitorGpuMs": 16.660000000000764, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.999999999999242, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer buffer uploads (0 vs 63 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.2800000000001148, - "maxMs": 0.3000000000000682, - "ratio": 1.0714285714283758 + "minMs": 0.5599999999976717, + "maxMs": 0.6399999999994179, + "ratio": 1.1428571428608552 }, "competitor": { - "minMs": 0.29999999999998295, - "maxMs": 0.31999999999993634, - "ratio": 1.066666666666515 + "minMs": 2.9799999999995634, + "maxMs": 3.569999999999709, + "ratio": 1.1979865771812859 }, - "stable": true, + "stable": false, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.20000000000027285, - "referenceP95Ms": 0.38000000000010914, - "referenceGpuMs": 0.206729, + "competitor": "phaser", + "referenceMs": 0.6399999999994179, + "referenceP95Ms": 0.8600000000005821, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.23999999999978172, - "competitorP95Ms": 0.42000000000007276, - "competitorGpuMs": 0.19004149999999997, + "competitorMs": 1.679999999993015, + "competitorP95Ms": 2.6600000000325963, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.8333333333352281, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.3809523809536184, + "factor": 2.6249999999914735, + "label": "ExoJS leads (2.62x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 63/1000/0 vs 63/1000/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1999999999998181, - "maxMs": 0.20000000000027285, - "ratio": 1.0000000000022737 + "minMs": 0.5599999999976717, + "maxMs": 0.6399999999994179, + "ratio": 1.1428571428608552 }, "competitor": { - "minMs": 0.22000000000025466, - "maxMs": 0.23999999999978172, - "ratio": 1.090909090906836 + "minMs": 1.5200000000186265, + "maxMs": 1.8500000000003638, + "ratio": 1.2171052631432193 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.11000000000012733, - "referenceP95Ms": 0.27999999999974534, - "referenceGpuMs": 0.30341700000000005, + "referenceMs": 0.6399999999994179, + "referenceP95Ms": 0.8600000000005821, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000038199, - "competitorP95Ms": 0.38000000000010914, - "competitorGpuMs": 0.241354, + "competitorMs": 0.5900000000001455, + "competitorP95Ms": 0.7600000000020373, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 1.0847457627106103, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 63/1000/0 vs 63/1000/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000040018, - "maxMs": 0.169999999999618, - "ratio": 2.8333333333080697 + "minMs": 0.5599999999976717, + "maxMs": 0.6399999999994179, + "ratio": 1.1428571428608552 }, "competitor": { - "minMs": 0.07999999999992724, - "maxMs": 0.15999999999985448, - "ratio": 2 + "minMs": 0.5400000000008731, + "maxMs": 0.6000000000058208, + "ratio": 1.1111111111200938 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "competitor-leads", - "exojs-leads" + "level", + "level", + "level" ] } } ] }, { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", "unit": "sprites", "primary": true, "cells": [ { - "competitor": "pixi", - "referenceMs": 1.9299999999998363, - "referenceP95Ms": 2.399999999999636, - "referenceGpuMs": 0.206667, + "competitor": "excalibur", + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.639999999999418, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 1.2699999999999818, - "competitorP95Ms": 1.9600000000000364, - "competitorGpuMs": 0.192, + "competitorMs": 12.63000000000011, + "competitorP95Ms": 14.680000000000291, + "competitorGpuMs": 22.599999999999454, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.5196850393699717, - "factor": 1.5196850393699717, - "label": "competitor leads (1.52x)", - "structural": false + "side": "exojs", + "ratio": 0.11084718923210159, + "factor": 9.021428571419273, + "label": "ExoJS leads clearly (9.02x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer buffer uploads (0 vs 313 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.7999999999997272, - "maxMs": 2, - "ratio": 1.1111111111112795 + "minMs": 1.3799999999973807, + "maxMs": 1.4199999999982538, + "ratio": 1.0289855072470646 }, "competitor": { - "minMs": 1.2399999999997817, - "maxMs": 1.2799999999997453, - "ratio": 1.0322580645161055 + "minMs": 12.450000000000273, + "maxMs": 17.59000000001106, + "ratio": 1.4128514056233472 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 1.6599999999998545, - "referenceP95Ms": 2.240000000000691, - "referenceGpuMs": 0.073459, + "competitor": "phaser", + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.639999999999418, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.9800000000004729, - "competitorP95Ms": 1.3599999999996726, - "competitorGpuMs": 0.0719585, + "competitorMs": 3.4500000000116415, + "competitorP95Ms": 5.020000000000437, + "competitorGpuMs": 16.660000000032596, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.6938775510194422, - "factor": 1.6938775510194422, - "label": "competitor leads (1.69x)", + "side": "exojs", + "ratio": 0.40579710144832787, + "factor": 2.464285714291468, + "label": "ExoJS leads (2.46x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6400000000003274, - "maxMs": 1.7100000000000364, - "ratio": 1.0426829268290823 + "minMs": 1.3799999999973807, + "maxMs": 1.4199999999982538, + "ratio": 1.0289855072470646 }, "competitor": { - "minMs": 0.9800000000000182, - "maxMs": 0.9900000000002365, - "ratio": 1.0102040816328757 + "minMs": 3.179999999993015, + "maxMs": 3.600000000002183, + "ratio": 1.1320754717012862 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 4.229999999999563, - "referenceP95Ms": 5.8400000000001455, - "referenceGpuMs": 0.2107915, + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.639999999999418, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 2.7600000000002183, - "competitorP95Ms": 10.05999999999949, - "competitorGpuMs": 0.1925625, + "competitorMs": 1.2099999999991269, + "competitorP95Ms": 1.9799999999959255, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.5326086956518945, - "factor": 1.5326086956518945, - "label": "competitor leads (1.53x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.860000000000582, - "maxMs": 4.230000000000473, - "ratio": 1.09585492227975 + "minMs": 1.3799999999973807, + "maxMs": 1.4199999999982538, + "ratio": 1.0289855072470646 }, "competitor": { - "minMs": 2.550000000000182, - "maxMs": 2.769999999999527, - "ratio": 1.0862745098036586 + "minMs": 1.139999999999418, + "maxMs": 1.2200000000011642, + "ratio": 1.0701754385980589 }, - "stable": true, + "stable": false, "rungs": [ "competitor-leads", - "competitor-leads", - "competitor-leads" + "level", + "level" ] } } ] }, { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", "unit": "sprites", "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 38, - "referenceP95Ms": 44.02000000000044, - "referenceGpuMs": 0.976, - "referenceOverFrameBudget": true, - "competitorMs": 27.970000000000255, - "competitorP95Ms": 32, - "competitorGpuMs": 0.6748544999999999, + "competitor": "excalibur", + "referenceMs": 3.4900000000052387, + "referenceP95Ms": 3.639999999999418, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 93.02500000000418, + "competitorP95Ms": 107.39000000000487, + "competitorGpuMs": 140.89999999999418, "competitorOverFrameBudget": true, "verdict": { - "side": "competitor", - "ratio": 1.358598498391121, - "factor": 1.358598498391121, - "label": "competitor leads (1.36x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer buffer uploads (0 vs 1563 per frame)", "timer": "resolved", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 37.01000000000022, - "maxMs": 40.13999999999942, - "ratio": 1.0845717373682566 + "minMs": 3.460000000006403, + "maxMs": 3.5200000000040745, + "ratio": 1.0173410404617227 }, "competitor": { - "minMs": 27.639999999999418, - "maxMs": 28.100000000000364, - "ratio": 1.0166425470333196 + "minMs": 84.51000000000022, + "maxMs": 101.54000000000815, + "ratio": 1.2015146136552821 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "nodes", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.5, - "referenceP95Ms": 0.7199999999993452, - "referenceGpuMs": 0.2287705, + "competitor": "phaser", + "referenceMs": 3.460000000006403, + "referenceP95Ms": 3.5800000000017462, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.5199999999995271, - "competitorP95Ms": 0.7599999999983993, - "competitorGpuMs": 0.130792, + "competitorMs": 9.550000000017462, + "competitorP95Ms": 12, + "competitorGpuMs": 16.660000000032596, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9615384615393361, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.3623036649214739, + "factor": 2.7601156069363557, + "label": "ExoJS leads (2.76x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1563/25000/0 vs 1563/25000/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4600000000009459, - "maxMs": 0.5599999999994907, - "ratio": 1.2173913043442157 + "minMs": 3.1999999999970896, + "maxMs": 3.5200000000040745, + "ratio": 1.1000000000022738 }, "competitor": { - "minMs": 0.5099999999993088, - "maxMs": 0.5399999999990541, - "ratio": 1.058823529411345 + "minMs": 9.420000000012806, + "maxMs": 9.650000000001455, + "ratio": 1.0244161358798658 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - } - ] - }, - { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 2.540000000000873, - "referenceP95Ms": 6.919999999998254, - "referenceGpuMs": 0.1434375, + "referenceMs": 3.460000000006403, + "referenceP95Ms": 3.5800000000017462, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 2.390000000001237, - "competitorP95Ms": 6.979999999999563, - "competitorGpuMs": 0.15862500000000002, + "competitorMs": 3.210000000002765, + "competitorP95Ms": 3.459999999999127, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.0627615062759659, + "ratio": 1.0778816199387609, "factor": 1, "label": "level", "structural": false }, - "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1563/25000/0 vs 1563/25000/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.4799999999995634, - "maxMs": 2.680000000000291, - "ratio": 1.0806451612906303 + "minMs": 3.1999999999970896, + "maxMs": 3.5200000000040745, + "ratio": 1.1000000000022738 }, "competitor": { - "minMs": 2.3699999999971624, - "maxMs": 2.5, - "ratio": 1.0548523206763685 + "minMs": 2.959999999999127, + "maxMs": 3.2399999999979627, + "ratio": 1.0945945945942293 }, "stable": true, "rungs": [ @@ -3928,409 +3750,383 @@ } } ] - } - ] - }, - { - "title": "Fill and GPU state", - "rows": [ + }, { - "archetype": "fill-layers", + "archetype": "mixed-blend", "category": "Fill and GPU state", - "count": 32, - "loadId": "32", - "unit": "layers", - "primary": true, + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.27999999999883585, - "referenceGpuMs": 0.58875, + "competitor": "excalibur", + "referenceMs": 0.180000000007567, + "referenceP95Ms": 0.2600000000093132, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.3600000000005821, - "competitorGpuMs": 0.634937, + "competitorMs": 2.5500000000029104, + "competitorP95Ms": 8.160000000003492, + "competitorGpuMs": 16.659999999996217, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.07058823529700453, + "factor": 14.166666666087284, + "label": "ExoJS leads clearly (14.17x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (26 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13999999999941792, - "maxMs": 0.15999999999985448, - "ratio": 1.1428571428608552 + "minMs": 0.180000000007567, + "maxMs": 0.19999999999708962, + "ratio": 1.1111111110482326 }, "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.1999999999989086, - "ratio": 1.1111111111032512 + "minMs": 2, + "maxMs": 2.569999999999709, + "ratio": 1.2849999999998545 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "level", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.6399999999994179, - "referenceP95Ms": 1.4799999999995634, - "referenceGpuMs": 0.2210625, + "competitor": "phaser", + "referenceMs": 0.180000000007567, + "referenceP95Ms": 0.2600000000093132, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.680000000000291, - "competitorP95Ms": 1.0200000000004366, - "competitorGpuMs": 0.1242705, + "competitorMs": 1.0199999999895226, + "competitorP95Ms": 1.2999999999883585, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.17647058824452544, + "factor": 5.666666666370238, + "label": "ExoJS leads clearly (5.67x)", + "structural": true }, - "mechanism": "competitor issues fewer texture binds (626 vs 314 per frame)", - "timer": "resolved", + "mechanism": "competitor issues fewer draw calls (26 vs 1 per frame)", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5200000000004366, - "maxMs": 0.7999999999992724, - "ratio": 1.5384615384588476 + "minMs": 0.180000000007567, + "maxMs": 0.19999999999708962, + "ratio": 1.1111111110482326 }, "competitor": { - "minMs": 0.5399999999999636, - "maxMs": 0.7000000000007276, - "ratio": 1.2962962962977311 + "minMs": 0.9200000000419095, + "maxMs": 1.1900000000000546, + "ratio": 1.2934782608107016 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.4099999999998545, - "referenceP95Ms": 0.5399999999972351, - "referenceGpuMs": 0.11906249999999999, + "referenceMs": 0.180000000007567, + "referenceP95Ms": 0.2600000000093132, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.5599999999976717, - "competitorP95Ms": 0.680000000000291, - "competitorGpuMs": 0.072354, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.22000000000116415, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.2857142857736812, + "factor": 1.2857142857736812, + "label": "competitor leads (1.29x)", "structural": false }, - "mechanism": "competitor issues fewer texture binds (240 vs 159 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 26/0/0 vs 32/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.37999999999919964, - "maxMs": 0.4399999999986903, - "ratio": 1.1578947368410974 + "minMs": 0.180000000007567, + "maxMs": 0.19999999999708962, + "ratio": 1.1111111110482326 }, "competitor": { - "minMs": 0.3599999999969441, - "maxMs": 0.5600000000013097, - "ratio": 1.555555555572398 + "minMs": 0.12000000000261934, + "maxMs": 0.13999999999941792, + "ratio": 1.16666666663635 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] - } - ] - }, - { - "title": "Material variety", - "rows": [ + }, { - "archetype": "batch-breaking-atlased", - "category": "Material variety", + "archetype": "mixed-blend", + "category": "Fill and GPU state", "count": 5000, "loadId": "5k", "unit": "sprites", "primary": true, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.11999999999898137, - "referenceP95Ms": 0.15999999999985448, - "referenceGpuMs": 0.125917, + "competitor": "excalibur", + "referenceMs": 0.47999999999592546, + "referenceP95Ms": 0.6999999999970896, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.31999999999970896, - "competitorGpuMs": 0.11552100000000001, + "competitorMs": 9.84000000001106, + "competitorP95Ms": 13.239999999997963, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.6666666666599297, - "factor": 1.5000000000151583, - "label": "ExoJS leads (1.50x)", - "structural": false + "ratio": 0.04878048780440914, + "factor": 20.50000000019706, + "label": "ExoJS leads clearly (20.50x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.10000000000218279, - "maxMs": 0.11999999999898137, - "ratio": 1.1999999999636202 + "minMs": 0.47999999999592546, + "maxMs": 0.5199999999967986, + "ratio": 1.0833333333358597 }, "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.18000000000029104, - "ratio": 1 + "minMs": 9.660000000003492, + "maxMs": 9.929999999996653, + "ratio": 1.0279503105582881 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - } - ] - }, - { - "title": "Text", - "rows": [ - { - "archetype": "text-static", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.2800000000024738, - "referenceGpuMs": 0.6382915, + "competitor": "phaser", + "referenceMs": 0.47999999999592546, + "referenceP95Ms": 0.6999999999970896, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.2000000000007276, - "competitorP95Ms": 0.3400000000001455, - "competitorGpuMs": 0.245938, + "competitorMs": 2.799999999999727, + "competitorP95Ms": 4.980000000000018, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.899999999998181, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.17142857142713294, + "factor": 5.833333333382281, + "label": "ExoJS leads clearly (5.83x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.2000000000007276, - "ratio": 1.1111111111133567 + "minMs": 0.47999999999592546, + "maxMs": 0.5199999999967986, + "ratio": 1.0833333333358597 }, "competitor": { - "minMs": 0.2000000000007276, - "maxMs": 0.2000000000007276, - "ratio": 1 + "minMs": 2.4200000000128057, + "maxMs": 2.8000000000029104, + "ratio": 1.1570247933835098 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "text-static", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.15999999999985448, - "referenceP95Ms": 0.2800000000024738, - "referenceGpuMs": 3.4241455, + "referenceMs": 0.47999999999592546, + "referenceP95Ms": 0.6999999999970896, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.37999999999738066, - "competitorGpuMs": 0.36543749999999997, + "competitorMs": 0.31999999999970896, + "competitorP95Ms": 0.4599999999991269, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.4999999999886313, + "factor": 1.4999999999886313, + "label": "competitor leads (1.50x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 120/0/0 vs 158/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1400000000030559, - "maxMs": 0.17000000000007276, - "ratio": 1.2142857142597288 + "minMs": 0.47999999999592546, + "maxMs": 0.5199999999967986, + "ratio": 1.0833333333358597 }, "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110931458 + "minMs": 0.3000000000029104, + "maxMs": 0.31999999999970896, + "ratio": 1.0666666666553486 }, - "stable": false, + "stable": true, "rungs": [ - "level", - "level", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "text-dynamic", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", - "primary": true, + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 2.8800000000010186, - "referenceP95Ms": 7.140000000003056, - "referenceGpuMs": 1.4768125, + "competitor": "excalibur", + "referenceMs": 1.0499999999956344, + "referenceP95Ms": 1.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 4.309999999999491, - "competitorP95Ms": 5.819999999999709, - "competitorGpuMs": 0.29060450000000004, - "competitorOverFrameBudget": false, + "competitorMs": 66.86999999999898, + "competitorP95Ms": 74.4800000000032, + "competitorGpuMs": 68.95999999999913, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.6682134570768814, - "factor": 1.4965277777770716, - "label": "ExoJS leads (1.50x)", - "structural": false + "ratio": 0.015702108568799916, + "factor": 63.6857142859781, + "label": "ExoJS leads clearly (63.69x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (782 vs 2 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.75, - "maxMs": 2.9899999999997817, - "ratio": 1.087272727272648 + "minMs": 0.9299999999930151, + "maxMs": 1.0800000000017462, + "ratio": 1.161290322591245 }, "competitor": { - "minMs": 4.200000000000728, - "maxMs": 4.479999999999563, - "ratio": 1.066666666666378 + "minMs": 65.33000000000175, + "maxMs": 69.16999999999825, + "ratio": 1.0587785091075526 }, "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "phaser", + "referenceMs": 1.0499999999956344, + "referenceP95Ms": 1.5, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 4.849999999999909, + "competitorP95Ms": 5.64000000001397, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (782 vs 2 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.9299999999930151, + "maxMs": 1.0800000000017462, + "ratio": 1.161290322591245 + }, + "competitor": { + "minMs": 4.779999999998836, + "maxMs": 5.220000000030268, + "ratio": 1.092050209211619 + }, + "stable": false, "rungs": [ "exojs-leads", "exojs-leads", - "exojs-leads" + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 7.920000000000073, - "referenceP95Ms": 9.299999999999272, - "referenceGpuMs": 3.80725, + "referenceMs": 1.0499999999956344, + "referenceP95Ms": 1.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 19.170000000000073, - "competitorP95Ms": 23.399999999997817, - "competitorGpuMs": 0.45458350000000003, - "competitorOverFrameBudget": true, + "competitorMs": 0.5, + "competitorP95Ms": 0.8800000000046566, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.41314553990610553, - "factor": 2.420454545454532, - "label": "ExoJS leads (2.42x)", + "side": "competitor", + "ratio": 2.099999999991269, + "factor": 2.099999999991269, + "label": "competitor leads (2.10x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 782/0/0 vs 782/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 7.1599999999998545, - "maxMs": 8.079999999999927, - "ratio": 1.1284916201117445 + "minMs": 0.9299999999930151, + "maxMs": 1.0800000000017462, + "ratio": 1.161290322591245 }, "competitor": { - "minMs": 18.959999999999127, - "maxMs": 19.289999999999054, - "ratio": 1.0174050632911362 + "minMs": 0.4400000000023283, + "maxMs": 0.5, + "ratio": 1.1363636363576233 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } @@ -4339,95 +4135,85 @@ ] }, { - "title": "Render targets", + "title": "Material variety", "rows": [ { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 5000, - "loadId": "5k", + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 1000, + "loadId": "1k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.5, - "referenceP95Ms": 0.9000000000014552, - "referenceGpuMs": 0.20479199999999997, + "competitor": "excalibur", + "referenceMs": 0.059999999997671694, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 2.0900000000019645, - "competitorP95Ms": 3.900000000001455, - "competitorGpuMs": 0.2813745, + "competitorMs": 2.720000000001164, + "competitorP95Ms": 6.779999999998836, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.23923444976054067, - "factor": 4.180000000003929, - "label": "ExoJS leads (4.18x)", - "structural": false + "ratio": 0.02205882352854633, + "factor": 45.333333335111895, + "label": "ExoJS leads clearly (45.33x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.46000000000276486, - "maxMs": 0.5400000000008731, - "ratio": 1.173913043473103 + "minMs": 0.059999999997671694, + "maxMs": 0.07999999998719431, + "ratio": 1.3333333331716455 }, "competitor": { - "minMs": 2.0600000000013097, - "maxMs": 2.349999999998545, - "ratio": 1.1407766990276946 + "minMs": 2.5100000000020373, + "maxMs": 2.7400000000052387, + "ratio": 1.0916334661366593 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.4599999999991269, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 0.234937, + "competitor": "phaser", + "referenceMs": 0.059999999997671694, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 2.360000000000582, - "competitorP95Ms": 3.4799999999959255, - "competitorGpuMs": 0.451791, + "competitorMs": 0.9400000000005093, + "competitorP95Ms": 1.220000000030268, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.1949152542368701, - "factor": 5.130434782619699, - "label": "ExoJS leads clearly (5.13x)", + "ratio": 0.06382978723153104, + "factor": 15.666666667283103, + "label": "ExoJS leads clearly (15.67x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4399999999986903, - "maxMs": 0.4599999999991269, - "ratio": 1.045454545455673 + "minMs": 0.059999999997671694, + "maxMs": 0.07999999998719431, + "ratio": 1.3333333331716455 }, "competitor": { - "minMs": 2.1999999999970896, - "maxMs": 2.7400000000016007, - "ratio": 1.2454545454569206 + "minMs": 0.9399999999732245, + "maxMs": 0.9500000000043656, + "ratio": 1.0106382979057722 }, "stable": true, "rungs": [ @@ -4436,26 +4222,16 @@ "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.4400000000023283, - "referenceP95Ms": 0.6599999999962165, - "referenceGpuMs": 0.3148955, + "referenceMs": 0.059999999997671694, + "referenceP95Ms": 0.10000000000582077, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 2.1999999999970896, - "competitorP95Ms": 3.819999999999709, - "competitorGpuMs": 0.7915205, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.17999999999301508, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -4464,146 +4240,125 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.4400000000023283, - "maxMs": 0.4599999999991269, - "ratio": 1.045454545447029 + "minMs": 0.059999999997671694, + "maxMs": 0.07999999998719431, + "ratio": 1.3333333331716455 }, "competitor": { - "minMs": 2.100000000002183, - "maxMs": 2.4099999999998545, - "ratio": 1.1476190476177854 + "minMs": 0.059999999997671694, + "maxMs": 0.09999999999126885, + "ratio": 1.6666666665858227 }, "stable": false, "rungs": [ - "exojs-leads-clearly", + "level", "exojs-leads", - "exojs-leads" + "level" ] } } ] }, { - "archetype": "composite", - "category": "Render targets", + "archetype": "batch-breaking-atlased", + "category": "Material variety", "count": 5000, "loadId": "5k", "unit": "sprites", "primary": true, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.4500000000007276, - "referenceP95Ms": 0.7199999999938882, - "referenceGpuMs": 0.3193745, + "competitor": "excalibur", + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.11999999999534339, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.7599999999983993, - "competitorP95Ms": 1.2200000000011642, - "competitorGpuMs": 0.42333350000000003, + "competitorMs": 10.139999999999418, + "competitorP95Ms": 14.160000000003492, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.5921052631600991, - "factor": 1.6888888888826012, - "label": "ExoJS leads (1.69x)", - "structural": false + "ratio": 0.007889546349822377, + "factor": 126.75000002028175, + "label": "ExoJS leads clearly (126.75x)", + "structural": true }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.42000000000189175, - "maxMs": 0.5600000000013097, - "ratio": 1.333333333330446 + "minMs": 0.06000000001222361, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333330908015 }, "competitor": { - "minMs": 0.7299999999995634, - "maxMs": 0.9199999999982538, - "ratio": 1.2602739726011014 + "minMs": 10.059999999997672, + "maxMs": 10.60000000000582, + "ratio": 1.053677932406389 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.3600000000005821, - "referenceP95Ms": 0.5999999999985448, - "referenceGpuMs": 0.30210349999999997, + "competitor": "phaser", + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.11999999999534339, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.31999999999970896, - "competitorP95Ms": 0.5, - "competitorGpuMs": 0.1531245, + "competitorMs": 2.780000000000655, + "competitorP95Ms": 4.760000000009313, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.028776978412653045, + "factor": 34.750000005570655, + "label": "ExoJS leads clearly (34.75x)", + "structural": true }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3499999999985448, - "maxMs": 0.3999999999978172, - "ratio": 1.142857142855658 + "minMs": 0.06000000001222361, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333330908015 }, "competitor": { - "minMs": 0.2800000000024738, - "maxMs": 0.41999999999825377, - "ratio": 1.499999999980511 + "minMs": 2.6599999999743886, + "maxMs": 2.8700000000026193, + "ratio": 1.0789473684324258 }, - "stable": false, + "stable": true, "rungs": [ - "level", - "competitor-leads", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 720, - "loadId": "720", - "unit": "viewport", - "primary": true, - "label": "1280 x 720", - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.42000000000552973, - "referenceP95Ms": 0.5800000000017462, - "referenceGpuMs": 0.313563, + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.11999999999534339, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.47999999999592546, - "competitorP95Ms": 0.7399999999979627, - "competitorGpuMs": 0.33620700000000003, + "competitorMs": 0.08999999999650754, + "competitorP95Ms": 0.180000000007567, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -4612,127 +4367,151 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3800000000046566, - "maxMs": 0.43999999999505235, - "ratio": 1.157894736814896 + "minMs": 0.06000000001222361, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333330908015 }, "competitor": { - "minMs": 0.4599999999991269, - "maxMs": 0.47999999999956344, - "ratio": 1.0434782608705968 + "minMs": 0.059999999997671694, + "maxMs": 0.09999999999126885, + "ratio": 1.6666666665858227 }, "stable": false, "rungs": [ "level", - "level", - "exojs-leads" + "exojs-leads", + "level" ] } } ] }, { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 5000, - "loadId": "5k", + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 25000, + "loadId": "25k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.37999999999738066, - "referenceP95Ms": 0.6199999999953434, - "referenceGpuMs": 0.26908299999999996, + "competitor": "excalibur", + "referenceMs": 0.06999999999970896, + "referenceP95Ms": 0.13999999999941792, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 64.03000000000611, + "competitorP95Ms": 70.67999999999302, + "competitorGpuMs": 65.93999999998778, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.001093237544896178, + "factor": 914.7142857181761, + "label": "ExoJS leads clearly (914.71x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.06000000000494765, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333332524893 + }, + "competitor": { + "minMs": 60.720000000001164, + "maxMs": 66.7100000000064, + "ratio": 1.0986495388670146 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "phaser", + "referenceMs": 0.06999999999970896, + "referenceP95Ms": 0.13999999999941792, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.42000000000552973, - "competitorP95Ms": 0.7199999999938882, - "competitorGpuMs": 0.0922915, + "competitorMs": 5.109999999993306, + "competitorP95Ms": 5.69999999999709, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9047619047437561, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.013698630136947292, + "factor": 73.00000000020788, + "label": "ExoJS leads clearly (73.00x)", + "structural": true }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.36999999999898137, - "maxMs": 0.4000000000014552, - "ratio": 1.0810810810879903 + "minMs": 0.06000000000494765, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333332524893 }, "competitor": { - "minMs": 0.42000000000189175, - "maxMs": 0.4400000000023283, - "ratio": 1.0476190476198726 + "minMs": 4.580000000001746, + "maxMs": 5.28000000002794, + "ratio": 1.152838427953259 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - } - ] - }, - { - "title": "Camera and world", - "rows": [ - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.25, - "referenceP95Ms": 1.5600000000013097, - "referenceGpuMs": 0.100583, + "referenceMs": 0.06999999999970896, + "referenceP95Ms": 0.13999999999941792, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.2000000000007276, - "competitorP95Ms": 0.3400000000001455, - "competitorGpuMs": 0.097875, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.16000000000349246, + "competitorGpuMs": 16.65999999998894, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 0.8749999999772626, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.23999999999978172, - "maxMs": 0.2800000000024738, - "ratio": 1.1666666666780354 + "minMs": 0.06000000000494765, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333332524893 }, "competitor": { - "minMs": 0.2000000000007276, - "maxMs": 0.21999999999752617, - "ratio": 1.0999999999836292 + "minMs": 0.06000000000494765, + "maxMs": 0.08000000000174623, + "ratio": 1.3333333332524893 }, - "stable": false, + "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", + "level", + "level", "level" ] } @@ -4742,399 +4521,339 @@ ] }, { - "title": "Tilemaps", + "title": "Text", "rows": [ { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", + "archetype": "text-static", + "category": "Text", + "count": 200, + "loadId": "200", + "unit": "labels", "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.26000000000203727, - "referenceP95Ms": 1.4400000000023283, - "referenceGpuMs": 0.0677085, + "competitor": "excalibur", + "referenceMs": 0.09999999997671694, + "referenceP95Ms": 0.1800000000221189, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.42000000000189175, - "competitorP95Ms": 0.7000000000043656, - "competitorGpuMs": 0.079042, + "competitorMs": 2.9800000000104774, + "competitorP95Ms": 4.4799999999813735, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.6190476190496814, - "factor": 1.6153846153792337, - "label": "ExoJS leads (1.62x)", - "structural": false + "ratio": 0.03355704697193468, + "factor": 29.800000007043128, + "label": "ExoJS leads clearly (29.80x)", + "structural": true }, - "mechanism": "ExoJS issues fewer buffer uploads (326 vs 652 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.26000000000203727, - "maxMs": 0.27999999999883585, - "ratio": 1.076923076910161 + "minMs": 0.08000000001629815, + "maxMs": 0.10000000000582077, + "ratio": 1.249999999818101 }, "competitor": { - "minMs": 0.4000000000014552, - "maxMs": 0.5300000000024738, - "ratio": 1.3250000000013642 + "minMs": 2.819999999992433, + "maxMs": 3.0800000000017462, + "ratio": 1.0921985815638338 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.8400000000037835, - "referenceGpuMs": 0.066458, + "competitor": "phaser", + "referenceMs": 0.09999999997671694, + "referenceP95Ms": 0.1800000000221189, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.42999999999665306, - "competitorP95Ms": 0.6399999999994179, - "competitorGpuMs": 0.0762915, + "competitorMs": 1.0999999999985448, + "competitorP95Ms": 1.5199999999895226, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.4186046511667258, - "factor": 2.388888888866432, - "label": "ExoJS leads (2.39x)", - "structural": false + "ratio": 0.09090909088804475, + "factor": 11.000000002546585, + "label": "ExoJS leads clearly (11.00x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (60 vs 2 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.26000000000203727, - "ratio": 1.444444444453427 + "minMs": 0.08000000001629815, + "maxMs": 0.10000000000582077, + "ratio": 1.249999999818101 }, "competitor": { - "minMs": 0.42000000000189175, - "maxMs": 0.4599999999991269, - "ratio": 1.0952380952310832 + "minMs": 1.0599999999976717, + "maxMs": 1.2399999999906868, + "ratio": 1.1698113207485004 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.8600000000005821, - "referenceP95Ms": 1.3800000000046566, - "referenceGpuMs": 0.06756200000000001, + "referenceMs": 0.09999999997671694, + "referenceP95Ms": 0.1800000000221189, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 1.8699999999989814, - "competitorP95Ms": 3.1200000000026193, - "competitorGpuMs": 0.06975, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.180000000007567, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.459893048128904, - "factor": 2.1744186046485066, - "label": "ExoJS leads (2.17x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.8599999999969441, - "maxMs": 1.0400000000008731, - "ratio": 1.2093023255867077 + "minMs": 0.08000000001629815, + "maxMs": 0.10000000000582077, + "ratio": 1.249999999818101 }, "competitor": { - "minMs": 1.2000000000043656, - "maxMs": 2.2699999999967986, - "ratio": 1.891666666657117 + "minMs": 0.08000000000174623, + "maxMs": 0.10000000000582077, + "ratio": 1.2500000000454747 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "competitor-leads" ] } } ] - } - ] - }, - { - "title": "Particles", - "rows": [ + }, { - "archetype": "particles-draw", - "category": "Particles", + "archetype": "text-static", + "category": "Text", "count": 1000, "loadId": "1k", - "unit": "particles", - "primary": false, + "unit": "labels", + "primary": true, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.27999999999883585, - "referenceP95Ms": 0.41999999999825377, - "referenceGpuMs": 0.070042, + "competitor": "excalibur", + "referenceMs": 0.08000000001629815, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.4400000000023283, - "competitorGpuMs": 0.06852050000000001, + "competitorMs": 5.9799999999959255, + "competitorP95Ms": 8.039999999993597, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.01337792642413924, + "factor": 74.74999998472049, + "label": "ExoJS leads clearly (74.75x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.2999999999956344, - "ratio": 1.0714285714174347 + "minMs": 0.07999999998719431, + "maxMs": 0.08999999999650754, + "ratio": 1.1250000001364242 }, "competitor": { - "minMs": 0.26000000000203727, - "maxMs": 0.3600000000005821, - "ratio": 1.384615384606774 + "minMs": 5.960000000006403, + "maxMs": 6, + "ratio": 1.0067114093948917 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.4400000000023283, - "referenceP95Ms": 0.5800000000017462, - "referenceGpuMs": 0.1442495, + "competitor": "phaser", + "referenceMs": 0.08000000001629815, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.25, - "competitorP95Ms": 0.4599999999991269, - "competitorGpuMs": 0.23293750000000002, + "competitorMs": 2.9100000000034925, + "competitorP95Ms": 4.3400000000037835, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.7600000000093132, - "factor": 1.7600000000093132, - "label": "competitor leads (1.76x)", - "structural": false + "side": "exojs", + "ratio": 0.027491408940275647, + "factor": 36.37499999263309, + "label": "ExoJS leads clearly (36.37x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.43999999999505235, - "maxMs": 0.4599999999991269, - "ratio": 1.045454545464317 + "minMs": 0.07999999998719431, + "maxMs": 0.08999999999650754, + "ratio": 1.1250000001364242 }, "competitor": { - "minMs": 0.23999999999796273, - "maxMs": 0.27999999999883585, - "ratio": 1.1666666666717194 + "minMs": 2.8000000000029104, + "maxMs": 2.9400000000023283, + "ratio": 1.0499999999997403 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 2.030000000002474, - "referenceP95Ms": 2.959999999999127, - "referenceGpuMs": 0.623188, + "referenceMs": 0.08000000001629815, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.3099999999976717, - "competitorP95Ms": 0.47999999999592546, - "competitorGpuMs": 0.2931875, + "competitorMs": 0.08999999999650754, + "competitorP95Ms": 0.17999999999301508, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 6.548387096831356, - "factor": 6.548387096831356, - "label": "competitor leads clearly (6.55x)", - "structural": true + "side": "neither", + "ratio": 0.8888888891044728, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.9099999999998545, - "maxMs": 2.139999999999418, - "ratio": 1.1204188481673198 + "minMs": 0.07999999998719431, + "maxMs": 0.08999999999650754, + "ratio": 1.1250000001364242 }, "competitor": { - "minMs": 0.27999999999883585, - "maxMs": 0.32999999999810825, - "ratio": 1.1785714285695725 + "minMs": 0.08000000000174623, + "maxMs": 0.10000000000582077, + "ratio": 1.2500000000454747 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "level", + "level", + "level" ] } } ] }, { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, + "archetype": "text-static", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 0.6999999999970896, - "referenceP95Ms": 0.8400000000037835, - "referenceGpuMs": 0.229396, + "competitor": "excalibur", + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 0.9599999999991269, - "competitorP95Ms": 1.2000000000043656, - "competitorGpuMs": 0.1384795, - "competitorOverFrameBudget": false, + "competitorMs": 32.30000000000291, + "competitorP95Ms": 35.779999999998836, + "competitorGpuMs": 33.63999999999942, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.7291666666642982, - "factor": 1.371428571433026, - "label": "ExoJS leads (1.37x)", - "structural": false + "ratio": 0.00247678018536183, + "factor": 403.750000064665, + "label": "ExoJS leads clearly (403.75x)", + "structural": true }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.6900000000023283, - "maxMs": 0.7099999999991269, - "ratio": 1.0289855072416392 + "minMs": 0.07999999998719431, + "maxMs": 0.08000000001629815, + "ratio": 1.0000000003637979 }, "competitor": { - "minMs": 0.9399999999986903, - "maxMs": 1.0400000000008731, - "ratio": 1.1063829787258745 + "minMs": 30.75999999999476, + "maxMs": 34.080000000001746, + "ratio": 1.1079323797141596 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - } - ] - }, - { - "title": "Interaction", - "rows": [ - { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 10000, - "loadId": "10k", - "unit": "rects", - "primary": true, - "cells": [ + }, { - "competitor": "pixi", - "referenceMs": 0.6100000000005821, - "referenceP95Ms": 0.9199999999982538, - "referenceGpuMs": 0.175959, + "competitor": "phaser", + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 17.63000000000102, - "competitorP95Ms": 22.099999999998545, - "competitorGpuMs": 0.293354, - "competitorOverFrameBudget": true, + "competitorMs": 6.559999999997672, + "competitorP95Ms": 7.7999999999883585, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.03460011344302591, - "factor": 28.90163934423639, - "label": "ExoJS leads clearly (28.90x)", + "ratio": 0.012195121949271755, + "factor": 82.00000001309672, + "label": "ExoJS leads clearly (82.00x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999976717, - "maxMs": 0.6100000000005821, - "ratio": 1.0892857142912826 + "minMs": 0.07999999998719431, + "maxMs": 0.08000000001629815, + "ratio": 1.0000000003637979 }, "competitor": { - "minMs": 16.61999999999898, - "maxMs": 17.68000000000029, - "ratio": 1.0637785800241502 + "minMs": 6.419999999983702, + "maxMs": 6.739999999990687, + "ratio": 1.0498442367613392 }, "stable": true, "rungs": [ @@ -5143,47 +4862,86 @@ "exojs-leads-clearly" ] } + }, + { + "competitor": "pixi", + "referenceMs": 0.07999999998719431, + "referenceP95Ms": 0.14000000001396984, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.20000000001164153, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.07999999998719431, + "maxMs": 0.08000000001629815, + "ratio": 1.0000000003637979 + }, + "competitor": { + "minMs": 0.059999999997671694, + "maxMs": 0.09999999999126885, + "ratio": 1.6666666665858227 + }, + "stable": false, + "rungs": [ + "level", + "level", + "competitor-leads" + ] + } } ] }, { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "widgets", - "primary": true, + "archetype": "text-dynamic", + "category": "Text", + "count": 200, + "loadId": "200", + "unit": "labels", + "primary": false, "cells": [ { - "competitor": "pixi", - "referenceMs": 10.2599999999984, - "referenceP95Ms": 10.780000000006112, - "referenceGpuMs": 0.0336665, + "competitor": "excalibur", + "referenceMs": 1.5099999999947613, + "referenceP95Ms": 2, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 48.62000000000262, - "competitorP95Ms": 52.599999999998545, - "competitorGpuMs": 0.033708, - "competitorOverFrameBudget": true, + "competitorMs": 2.710000000006403, + "competitorP95Ms": 4.69999999999709, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.21102426984775496, - "factor": 4.738791423002944, - "label": "ExoJS leads (4.74x)", + "ratio": 0.5571955719524699, + "factor": 1.7947019867654337, + "label": "ExoJS leads (1.79x)", "structural": false }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 10.220000000001164, - "maxMs": 10.400000000001455, - "ratio": 1.017612524461866 + "minMs": 1.3400000000110595, + "maxMs": 1.570000000006985, + "ratio": 1.1716417910403187 }, "competitor": { - "minMs": 48.36000000000058, - "maxMs": 48.70000000000073, - "ratio": 1.0070306038048003 + "minMs": 2.3800000000046566, + "maxMs": 2.9100000000034925, + "ratio": 1.2226890756293272 }, "stable": true, "rungs": [ @@ -5192,37 +4950,6923 @@ "exojs-leads" ] } - } - ] - } - ] - } - ], - "excluded": [ - { - "archetype": "overdraw", - "reason": "not measured in this run" - }, - { - "archetype": "split-screen", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "instanced-batch", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-static", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "competitor": "phaser", + "referenceMs": 1.5099999999947613, + "referenceP95Ms": 2, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 1.2399999999906868, + "competitorP95Ms": 1.5600000000267755, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.3400000000110595, + "maxMs": 1.570000000006985, + "ratio": 1.1716417910403187 + }, + "competitor": { + "minMs": 1.2200000000011642, + "maxMs": 1.3000000000174623, + "ratio": 1.0655737705050998 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "competitor-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 1.5099999999947613, + "referenceP95Ms": 2, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 2.6200000000026193, + "competitorP95Ms": 4.0200000000040745, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5763358778600197, + "factor": 1.7350993377560986, + "label": "ExoJS leads (1.74x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.3400000000110595, + "maxMs": 1.570000000006985, + "ratio": 1.1716417910403187 + }, + "competitor": { + "minMs": 2.6199999999953434, + "maxMs": 2.779999999998836, + "ratio": 1.061068702291518 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, + "cells": [ + { + "competitor": "excalibur", + "referenceMs": 2.8999999999941792, + "referenceP95Ms": 7.2999999999883585, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 6.3399999999965075, + "competitorP95Ms": 8.85999999998603, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.4574132492106903, + "factor": 2.186206896554908, + "label": "ExoJS leads (2.19x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.6299999999901047, + "maxMs": 3.070000000006985, + "ratio": 1.1673003802351847 + }, + "competitor": { + "minMs": 6.150000000001455, + "maxMs": 6.399999999994179, + "ratio": 1.0406504065028723 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "phaser", + "referenceMs": 2.8999999999941792, + "referenceP95Ms": 7.2999999999883585, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 2.9100000000034925, + "competitorP95Ms": 4.720000000001164, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9965635738799652, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.6299999999901047, + "maxMs": 3.070000000006985, + "ratio": 1.1673003802351847 + }, + "competitor": { + "minMs": 2.7800000000279397, + "maxMs": 3.139999999999418, + "ratio": 1.1294964028661367 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 2.8999999999941792, + "referenceP95Ms": 7.2999999999883585, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 4.190000000002328, + "competitorP95Ms": 6, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6921241050101594, + "factor": 1.4448275862105993, + "label": "ExoJS leads (1.44x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.6299999999901047, + "maxMs": 3.070000000006985, + "ratio": 1.1673003802351847 + }, + "competitor": { + "minMs": 4.069999999999709, + "maxMs": 4.2999999999883585, + "ratio": 1.0565110565082718 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, + "cells": [ + { + "competitor": "excalibur", + "referenceMs": 7.35999999998603, + "referenceP95Ms": 8.660000000003492, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 32.44999999999709, + "competitorP95Ms": 36.16000000000349, + "competitorGpuMs": 34.179999999993015, + "competitorOverFrameBudget": true, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 7.189999999987776, + "maxMs": 7.419999999983702, + "ratio": 1.0319888734348146 + }, + "competitor": { + "minMs": 31.74000000000524, + "maxMs": 36.68999999999505, + "ratio": 1.1559546313796156 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "phaser", + "referenceMs": 7.35999999998603, + "referenceP95Ms": 8.660000000003492, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 6.940000000002328, + "competitorP95Ms": 8.180000000000291, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0605187319861038, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 7.189999999987776, + "maxMs": 7.419999999983702, + "ratio": 1.0319888734348146 + }, + "competitor": { + "minMs": 6.710000000002765, + "maxMs": 7.369999999995343, + "ratio": 1.0983606557365584 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 7.35999999998603, + "referenceP95Ms": 8.660000000003492, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 20.43000000000029, + "competitorP95Ms": 25.44000000000233, + "competitorGpuMs": 22.720000000001164, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.36025452765471977, + "factor": 2.775815217396613, + "label": "ExoJS leads (2.78x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 7.189999999987776, + "maxMs": 7.419999999983702, + "ratio": 1.0319888734348146 + }, + "competitor": { + "minMs": 20.349999999998545, + "maxMs": 21.029999999998836, + "ratio": 1.0334152334152502 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] }, { - "archetype": "mixed-sprite-mesh-array", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, + "title": "Render targets", + "rows": [ + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.3200000000069849, + "referenceP95Ms": 0.6199999999953434, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.6399999999994179, + "competitorP95Ms": 1.2400000000052387, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5000000000113687, + "factor": 1.9999999999545253, + "label": "ExoJS leads (2.00x)", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.33999999999650754, + "ratio": 1.133333333365671 + }, + "competitor": { + "minMs": 0.6199999999953434, + "maxMs": 0.6600000000034925, + "ratio": 1.0645161290458862 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 2.180000000000291, + "competitorP95Ms": 3.720000000001164, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.1009174311931811, + "factor": 9.909090909039797, + "label": "ExoJS leads clearly (9.91x)", + "structural": true + }, + "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.21000000000640284, + "maxMs": 0.22000000000116415, + "ratio": 1.0476190475926497 + }, + "competitor": { + "minMs": 2.0600000000049477, + "maxMs": 2.1999999999970896, + "ratio": 1.067961165044566 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.20000000001164153, + "referenceP95Ms": 0.33999999999650754, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 3.5199999999967986, + "competitorP95Ms": 6.819999999992433, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.05681818182154075, + "factor": 17.59999999895954, + "label": "ExoJS leads clearly (17.60x)", + "structural": true + }, + "mechanism": "competitor issues fewer draw calls (9 vs 2 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.17999999999301508, + "maxMs": 0.2599999999802094, + "ratio": 1.4444444443905484 + }, + "competitor": { + "minMs": 3.349999999998545, + "maxMs": 3.819999999999709, + "ratio": 1.140298507463095 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.39999999999417923, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.7599999999947613, + "competitorP95Ms": 1.180000000007567, + "competitorGpuMs": 16.680000000007567, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.28947368421405345, + "factor": 3.454545454503362, + "label": "ExoJS leads (3.45x)", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.21000000000640284, + "maxMs": 0.23999999999068677, + "ratio": 1.1428571427779488 + }, + "competitor": { + "minMs": 0.5999999999985448, + "maxMs": 0.8000000000029104, + "ratio": 1.3333333333414177 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.3200000000069849, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 2.2400000000052387, + "competitorP95Ms": 3.7000000000116415, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.09821428571457573, + "factor": 10.181818181788117, + "label": "ExoJS leads clearly (10.18x)", + "structural": true + }, + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1999999999825377, + "maxMs": 0.22000000000116415, + "ratio": 1.1000000001018635 + }, + "competitor": { + "minMs": 2.0199999999967986, + "maxMs": 2.3000000000029104, + "ratio": 1.138613861389384 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.19999999999708962, + "referenceP95Ms": 0.360000000015134, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 3.6300000000046566, + "competitorP95Ms": 6.0200000000040745, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.05509641873190993, + "factor": 18.150000000287402, + "label": "ExoJS leads clearly (18.15x)", + "structural": true + }, + "mechanism": "competitor issues fewer draw calls (10 vs 3 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1900000000023283, + "maxMs": 0.23999999999068677, + "ratio": 1.263157894672346 + }, + "competitor": { + "minMs": 3.319999999999709, + "maxMs": 3.8699999999953434, + "ratio": 1.1656626506011092 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.35999999998603016, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.6199999999953434, + "competitorP95Ms": 0.9600000000064028, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.3548387096819621, + "factor": 2.818181818145739, + "label": "ExoJS leads (2.82x)", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22000000000116415, + "maxMs": 0.2400000000197906, + "ratio": 1.0909090909932755 + }, + "competitor": { + "minMs": 0.5199999999967986, + "maxMs": 0.6600000000034925, + "ratio": 1.2692307692452995 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.23999999999068677, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 2.139999999999418, + "competitorP95Ms": 3.6600000000034925, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.1121495327059589, + "factor": 8.916666667010254, + "label": "ExoJS leads clearly (8.92x)", + "structural": true + }, + "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22000000000116415, + "maxMs": 0.23999999999068677, + "ratio": 1.0909090908609853 + }, + "competitor": { + "minMs": 2.1000000000058208, + "maxMs": 2.280000000006112, + "ratio": 1.0857142857141868 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.20000000001164153, + "referenceP95Ms": 0.3200000000069849, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 3.3999999999869033, + "competitorP95Ms": 6.2999999999883585, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.05882352941541527, + "factor": 16.999999998944986, + "label": "ExoJS leads clearly (17.00x)", + "structural": true + }, + "mechanism": "competitor issues fewer draw calls (12 vs 5 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.19999999999708962, + "maxMs": 0.22000000000116415, + "ratio": 1.100000000021828 + }, + "competitor": { + "minMs": 3.3099999999903957, + "maxMs": 3.6900000000023283, + "ratio": 1.1148036253815816 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.29999999998835847, + "referenceP95Ms": 0.4800000000104774, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.39999999999417923, + "competitorP95Ms": 0.6999999999825377, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.27999999999883585, + "maxMs": 0.319999999992433, + "ratio": 1.1428571428348695 + }, + "competitor": { + "minMs": 0.35999999998603016, + "maxMs": 0.41999999998370185, + "ratio": 1.1666666666666667 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "exojs-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.25, + "referenceP95Ms": 0.41999999998370185, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.3000000000029104, + "competitorP95Ms": 0.5200000000186265, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22000000000116415, + "maxMs": 0.27999999999883585, + "ratio": 1.2727272727152463 + }, + "competitor": { + "minMs": 0.27000000000407454, + "maxMs": 0.35000000000582077, + "ratio": 1.2962962962982925 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.28000000001338776, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 16.65999999997439, + "referenceOverFrameBudget": false, + "competitorMs": 0.27999999999883585, + "competitorP95Ms": 0.4599999999918509, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.27999999999883585, + "maxMs": 0.28999999999359716, + "ratio": 1.0357142856957247 + }, + "competitor": { + "minMs": 0.23999999999068677, + "maxMs": 0.27999999999883585, + "ratio": 1.1666666667070886 + }, + "stable": false, + "rungs": [ + "level", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.1900000000023283, + "referenceP95Ms": 0.3199999999778811, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.14000000001396984, + "competitorP95Ms": 0.2400000000197906, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.14000000001396984, + "maxMs": 0.19999999999708962, + "ratio": 1.4285714284080908 + }, + "competitor": { + "minMs": 0.11999999999534339, + "maxMs": 0.16000000000349246, + "ratio": 1.3333333334141773 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.19999999999708962, + "referenceP95Ms": 0.3200000000069849, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.139999999984866, + "competitorP95Ms": 0.2400000000197906, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.4285714287050686, + "factor": 1.4285714287050686, + "label": "competitor leads (1.43x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1999999999825377, + "maxMs": 0.22000000000116415, + "ratio": 1.1000000001018635 + }, + "competitor": { + "minMs": 0.11999999999534339, + "maxMs": 0.14000000001396984, + "ratio": 1.1666666668283545 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.17999999999301508, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.11999999999534339, + "competitorP95Ms": 0.22000000000116415, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.5, + "factor": 1.5, + "label": "competitor leads (1.50x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 10 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000349246, + "maxMs": 0.17999999999301508, + "ratio": 1.124999999931788 + }, + "competitor": { + "minMs": 0.10000000000582077, + "maxMs": 0.14000000001396984, + "ratio": 1.4000000000582076 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 360, + "loadId": "360", + "unit": "viewport", + "primary": false, + "label": "640 x 360", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.22000000000116415, + "competitorP95Ms": 0.3800000000046566, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22000000000116415, + "maxMs": 0.23999999999068677, + "ratio": 1.0909090908609853 + }, + "competitor": { + "minMs": 0.17999999999301508, + "maxMs": 0.27999999999883585, + "ratio": 1.5555555556094516 + }, + "stable": false, + "rungs": [ + "level", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 720, + "loadId": "720", + "unit": "viewport", + "primary": true, + "label": "1280 x 720", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.23999999999068677, + "referenceP95Ms": 0.360000000015134, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.22000000000116415, + "competitorP95Ms": 0.40000000002328306, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22000000000116415, + "maxMs": 0.2600000000093132, + "ratio": 1.181818181854261 + }, + "competitor": { + "minMs": 0.17999999999301508, + "maxMs": 0.2400000000197906, + "ratio": 1.3333333334950213 + }, + "stable": false, + "rungs": [ + "level", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 1080, + "loadId": "1080", + "unit": "viewport", + "primary": false, + "label": "1920 x 1080", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2600000000093132, + "referenceP95Ms": 0.41999999998370185, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.22000000000116415, + "competitorP95Ms": 0.39999999999417923, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.25, + "maxMs": 0.27999999999883585, + "ratio": 1.1199999999953434 + }, + "competitor": { + "minMs": 0.1800000000221189, + "maxMs": 0.23999999999068677, + "ratio": 1.3333333331177495 + }, + "stable": false, + "rungs": [ + "level", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000003026798, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.660000000032596, + "referenceOverFrameBudget": false, + "competitorMs": 0.27000000000407454, + "competitorP95Ms": 0.4400000000023283, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.8148148149146222, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.20000000001164153, + "maxMs": 0.22000000003026798, + "ratio": 1.1000000000873116 + }, + "competitor": { + "minMs": 0.23999999999068677, + "maxMs": 0.27000000000407454, + "ratio": 1.125000000060633 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.21999999997206032, + "referenceP95Ms": 0.35999999998603016, + "referenceGpuMs": 16.660000000032596, + "referenceOverFrameBudget": false, + "competitorMs": 0.3800000000046566, + "competitorP95Ms": 0.5200000000186265, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5789473683404326, + "factor": 1.727272727513255, + "label": "ExoJS leads (1.73x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.20000000001164153, + "maxMs": 0.21999999997206032, + "ratio": 1.0999999997962733 + }, + "competitor": { + "minMs": 0.35999999998603016, + "maxMs": 0.41999999998370185, + "ratio": 1.1666666666666667 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.17999999999301508, + "referenceP95Ms": 0.4200000000419095, + "referenceGpuMs": 16.660000000032596, + "referenceOverFrameBudget": false, + "competitorMs": 0.7699999999895226, + "competitorP95Ms": 1, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.2337662337603433, + "factor": 4.27777777788557, + "label": "ExoJS leads (4.28x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 10 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.17999999999301508, + "maxMs": 0.23999999999068677, + "ratio": 1.3333333333333333 + }, + "competitor": { + "minMs": 0.7000000000116415, + "maxMs": 0.8700000000098953, + "ratio": 1.2428571428506094 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Camera and world", + "rows": [ + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.15999999997438863, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.10000000000582077, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.5999999996507541, + "factor": 1.5999999996507541, + "label": "competitor leads (1.60x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.14000000001396984, + "maxMs": 0.16999999999825377, + "ratio": 1.2142857141520742 + }, + "competitor": { + "minMs": 0.08000000000174623, + "maxMs": 0.11999999999534339, + "ratio": 1.4999999999090505 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.12000000002444722, + "referenceP95Ms": 1.179999999993015, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.10000000000582077, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.200000000174623, + "factor": 1.200000000174623, + "label": "competitor leads (1.20x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.11999999999534339, + "maxMs": 0.1300000000046566, + "ratio": 1.0833333334141773 + }, + "competitor": { + "minMs": 0.06000000001222361, + "maxMs": 0.10000000000582077, + "ratio": 1.6666666664241347 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.11999999999534339, + "referenceP95Ms": 1.5200000000186265, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.09999999999126885, + "competitorP95Ms": 0.180000000007567, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.11999999999534339, + "maxMs": 0.1200000000098953, + "ratio": 1.0000000001212659 + }, + "competitor": { + "minMs": 0.08000000000174623, + "maxMs": 0.10000000000582077, + "ratio": 1.2500000000454747 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.14000000001396984, + "referenceP95Ms": 1.820000000006985, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.09999999999126885, + "competitorP95Ms": 0.16000000000349246, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.4000000002619344, + "factor": 1.4000000002619344, + "label": "competitor leads (1.40x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (60 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1200000000098953, + "maxMs": 0.14999999999417923, + "ratio": 1.2499999998484175 + }, + "competitor": { + "minMs": 0.059999999997671694, + "maxMs": 0.09999999999126885, + "ratio": 1.6666666665858227 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.08000000000174623, + "referenceP95Ms": 1.0599999999976717, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.03999999999359716, + "competitorP95Ms": 0.16000000000349246, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.000000000363798, + "factor": 2.000000000363798, + "label": "competitor leads (2.00x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.069999999992433, + "maxMs": 0.08000000001629815, + "ratio": 1.1428571432135164 + }, + "competitor": { + "minMs": 0.03999999999359716, + "maxMs": 0.040000000000873115, + "ratio": 1.000000000181899 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Tilemaps", + "rows": [ + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.16000000000349246, + "referenceP95Ms": 1.459999999991851, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.1999999999825377, + "competitorP95Ms": 0.41999999999825377, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.8000000000873115, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000349246, + "maxMs": 0.180000000007567, + "ratio": 1.1250000000227374 + }, + "competitor": { + "minMs": 0.17999999999301508, + "maxMs": 0.20000000000436557, + "ratio": 1.111111111178481 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.16000000000349246, + "referenceP95Ms": 1.459999999991851, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.21000000000640284, + "competitorP95Ms": 0.3800000000046566, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (90 vs 282 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000349246, + "maxMs": 0.180000000007567, + "ratio": 1.1250000000227374 + }, + "competitor": { + "minMs": 0.17999999999301508, + "maxMs": 0.22000000000116415, + "ratio": 1.222222222276118 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.14000000001396984, + "referenceP95Ms": 0.8000000000174623, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.1300000000046566, + "competitorP95Ms": 0.35999999998603016, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0769230769919618, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1200000000098953, + "maxMs": 0.14000000001396984, + "ratio": 1.1666666666868777 + }, + "competitor": { + "minMs": 0.12999999997555278, + "maxMs": 0.13999999999941792, + "ratio": 1.0769230771211207 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.14000000001396984, + "referenceP95Ms": 0.8000000000174623, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.20000000001164153, + "competitorP95Ms": 0.4399999999732245, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.7000000000291038, + "factor": 1.428571428512033, + "label": "ExoJS leads (1.43x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (30 vs 2 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1200000000098953, + "maxMs": 0.14000000001396984, + "ratio": 1.1666666666868777 + }, + "competitor": { + "minMs": 0.16000000000349246, + "maxMs": 0.20999999999185093, + "ratio": 1.3124999999204192 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.9400000000023283, + "referenceP95Ms": 1.7999999999883585, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.6999999999825377, + "competitorP95Ms": 1.0399999999935972, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3428571428939682, + "factor": 1.3428571428939682, + "label": "competitor leads (1.34x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.8799999999901047, + "maxMs": 0.9700000000011642, + "ratio": 1.1022727272864448 + }, + "competitor": { + "minMs": 0.6399999999994179, + "maxMs": 0.6999999999970896, + "ratio": 1.0937499999964473 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.9400000000023283, + "referenceP95Ms": 1.7999999999883585, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 1.360000000015134, + "competitorP95Ms": 1.7399999999906868, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.691176470582256, + "factor": 1.4468085106508142, + "label": "ExoJS leads (1.45x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.8799999999901047, + "maxMs": 0.9700000000011642, + "ratio": 1.1022727272864448 + }, + "competitor": { + "minMs": 1.320000000006985, + "maxMs": 1.4199999999837019, + "ratio": 1.0757575757395361 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.7300000000104774, + "referenceP95Ms": 1.1600000000034925, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 1.320000000006985, + "competitorP95Ms": 3.6600000000034925, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.553030303035314, + "factor": 1.8082191780658077, + "label": "ExoJS leads (1.81x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.7099999999918509, + "maxMs": 0.7700000000040745, + "ratio": 1.0845070422717074 + }, + "competitor": { + "minMs": 1.220000000015716, + "maxMs": 1.680000000000291, + "ratio": 1.3770491803103682 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.7300000000104774, + "referenceP95Ms": 1.1600000000034925, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.7700000000040745, + "competitorP95Ms": 1.540000000008149, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.7099999999918509, + "maxMs": 0.7700000000040745, + "ratio": 1.0845070422717074 + }, + "competitor": { + "minMs": 0.7000000000116415, + "maxMs": 0.8900000000139698, + "ratio": 1.2714285714273834 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "level" + ] + } + } + ] + } + ] + }, + { + "title": "Particles", + "rows": [ + { + "archetype": "particles-draw", + "category": "Particles", + "count": 1000, + "loadId": "1k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.2600000000093132, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.8399999999674037, + "competitorP95Ms": 1.0200000000040745, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.3095238095469078, + "factor": 3.2307692305281344, + "label": "ExoJS leads (3.23x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.29999999998835847, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.8000000000029104, + "maxMs": 0.860000000015134, + "ratio": 1.0750000000150066 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.2600000000093132, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.1200000000098953, + "competitorP95Ms": 0.2600000000093132, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.166666666565612, + "factor": 2.166666666565612, + "label": "competitor leads (2.17x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.29999999998835847, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.10000000000582077, + "maxMs": 0.139999999984866, + "ratio": 1.3999999997671693 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.4599999999918509, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 2.710000000006403, + "competitorP95Ms": 3.779999999998836, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.1697416974135661, + "factor": 5.891304347944373, + "label": "ExoJS leads clearly (5.89x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4599999999918509, + "maxMs": 0.5, + "ratio": 1.0869565217583863 + }, + "competitor": { + "minMs": 2.679999999993015, + "maxMs": 2.779999999998836, + "ratio": 1.03731343283809 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.4599999999918509, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 0.10000000000582077, + "competitorP95Ms": 0.2400000000197906, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4599999999918509, + "maxMs": 0.5, + "ratio": 1.0869565217583863 + }, + "competitor": { + "minMs": 0.08000000001629815, + "maxMs": 0.11999999999534339, + "ratio": 1.4999999996362021 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 1.7200000000011642, + "referenceP95Ms": 2.8999999999941792, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 9.339999999996508, + "competitorP95Ms": 10.080000000016298, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.1841541755890586, + "factor": 5.430232558133828, + "label": "ExoJS leads clearly (5.43x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.610000000000582, + "maxMs": 1.790000000008149, + "ratio": 1.1118012422406844 + }, + "competitor": { + "minMs": 9.310000000004948, + "maxMs": 9.60999999998603, + "ratio": 1.0322234156800132 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 1.7200000000011642, + "referenceP95Ms": 2.8999999999941792, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.10000000002037268, + "competitorP95Ms": 0.27999999999883585, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 17.19999999650754, + "factor": 17.19999999650754, + "label": "competitor leads clearly (17.20x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.610000000000582, + "maxMs": 1.790000000008149, + "ratio": 1.1118012422406844 + }, + "competitor": { + "minMs": 0.10000000000582077, + "maxMs": 0.13999999999941792, + "ratio": 1.3999999999126884 + }, + "stable": true, + "rungs": [ + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 1000, + "loadId": "1k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.319999999992433, + "referenceP95Ms": 0.4200000000128057, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.9000000000087311, + "competitorP95Ms": 1.2400000000052387, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.35555555554369844, + "factor": 2.8125000000937916, + "label": "ExoJS leads (2.81x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.3200000000069849, + "ratio": 1.0666666667313418 + }, + "competitor": { + "minMs": 0.8999999999941792, + "maxMs": 0.9199999999837019, + "ratio": 1.0222222222107245 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.319999999992433, + "referenceP95Ms": 0.4200000000128057, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.27999999999883585, + "competitorP95Ms": 0.39999999999417923, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.3200000000069849, + "ratio": 1.0666666667313418 + }, + "competitor": { + "minMs": 0.2600000000093132, + "maxMs": 0.29999999998835847, + "ratio": 1.1538461537600477 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 1.1199999999953434, + "referenceP95Ms": 1.7200000000011642, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 3.220000000001164, + "competitorP95Ms": 6.220000000001164, + "competitorGpuMs": 16.660000000032596, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.3478260869549498, + "factor": 2.8750000000129927, + "label": "ExoJS leads (2.88x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.1199999999953434, + "maxMs": 1.5999999999912689, + "ratio": 1.4285714285695725 + }, + "competitor": { + "minMs": 3.2000000000116415, + "maxMs": 3.6299999999901047, + "ratio": 1.1343749999927808 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 1.1199999999953434, + "referenceP95Ms": 1.7200000000011642, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 0.8400000000110595, + "competitorP95Ms": 1.0599999999976717, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.333333333310235, + "factor": 1.333333333310235, + "label": "competitor leads (1.33x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.1199999999953434, + "maxMs": 1.5999999999912689, + "ratio": 1.4285714285695725 + }, + "competitor": { + "minMs": 0.8200000000069849, + "maxMs": 0.8800000000046566, + "ratio": 1.0731707317038544 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 3.3000000000029104, + "referenceP95Ms": 4.179999999993015, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 27.030000000013388, + "competitorP95Ms": 29.080000000001746, + "competitorGpuMs": 27.879999999990105, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.12208657047729471, + "factor": 8.190909090905924, + "label": "ExoJS leads clearly (8.19x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.720000000001164, + "maxMs": 3.8099999999976717, + "ratio": 1.4007352941161915 + }, + "competitor": { + "minMs": 26.849999999998545, + "maxMs": 27.03000000002794, + "ratio": 1.0067039106156204 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 3.3000000000029104, + "referenceP95Ms": 4.179999999993015, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 2.4400000000023283, + "competitorP95Ms": 3.6000000000058208, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.720000000001164, + "maxMs": 3.8099999999976717, + "ratio": 1.4007352941161915 + }, + "competitor": { + "minMs": 2.360000000000582, + "maxMs": 2.7000000000116415, + "ratio": 1.1440677966148203 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "level" + ] + } + } + ] + } + ] + }, + { + "title": "Interaction", + "rows": [ + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "rects", + "primary": false, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.2599999999802094, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 4.880000000004657, + "competitorP95Ms": 6.779999999998836, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.05327868852048387, + "factor": 18.76923077067735, + "label": "ExoJS leads clearly (18.77x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.27999999999883585, + "ratio": 1.1666666667070886 + }, + "competitor": { + "minMs": 4.830000000001746, + "maxMs": 4.970000000001164, + "ratio": 1.0289855072462457 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.2599999999802094, + "referenceP95Ms": 0.3800000000046566, + "referenceGpuMs": 16.679999999993015, + "referenceOverFrameBudget": false, + "competitorMs": 4.980000000010477, + "competitorP95Ms": 6.85999999998603, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.0522088353372816, + "factor": 19.1538461553444, + "label": "ExoJS leads clearly (19.15x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.27999999999883585, + "ratio": 1.1666666667070886 + }, + "competitor": { + "minMs": 4.959999999991851, + "maxMs": 5.009999999994761, + "ratio": 1.0100806451618936 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 10000, + "loadId": "10k", + "unit": "rects", + "primary": true, + "cells": [ + { + "competitor": "phaser", + "referenceMs": 0.47999999998137355, + "referenceP95Ms": 0.8399999999965075, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 31.820000000006985, + "competitorP95Ms": 34.5, + "competitorGpuMs": 32.45999999999185, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.01508485229356594, + "factor": 66.29166666925367, + "label": "ExoJS leads clearly (66.29x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.47000000000116415, + "maxMs": 0.5800000000162981, + "ratio": 1.2340425532231096 + }, + "competitor": { + "minMs": 31.699999999982538, + "maxMs": 32.47000000000844, + "ratio": 1.0242902208210198 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "pixi", + "referenceMs": 0.47999999998137355, + "referenceP95Ms": 0.8399999999965075, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 17.15000000000873, + "competitorP95Ms": 22.04000000000815, + "competitorGpuMs": 17.60000000000582, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.027988338191319486, + "factor": 35.72916666807133, + "label": "ExoJS leads clearly (35.73x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.47000000000116415, + "maxMs": 0.5800000000162981, + "ratio": 1.2340425532231096 + }, + "competitor": { + "minMs": 16.660000000003492, + "maxMs": 17.19999999999709, + "ratio": 1.0324129651856833 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 100, + "loadId": "100", + "unit": "widgets", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.6999999999970896, + "referenceP95Ms": 3.5399999999790452, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 5.869999999995343, + "competitorP95Ms": 6.480000000010477, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.45996592844961354, + "factor": 2.174074074074693, + "label": "ExoJS leads (2.17x)", + "structural": false + }, + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.6199999999953434, + "maxMs": 2.900000000008731, + "ratio": 1.1068702290129333 + }, + "competitor": { + "minMs": 5.720000000001164, + "maxMs": 5.940000000002328, + "ratio": 1.0384615384617342 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "widgets", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 10.279999999998836, + "referenceP95Ms": 10.880000000004657, + "referenceGpuMs": 16.660000000003492, + "referenceOverFrameBudget": false, + "competitorMs": 48.16000000000349, + "competitorP95Ms": 51.179999999993015, + "competitorGpuMs": 48.779999999998836, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.21345514950162148, + "factor": 4.684824902724606, + "label": "ExoJS leads (4.68x)", + "structural": false + }, + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.279999999998836, + "maxMs": 10.339999999996508, + "ratio": 1.0058365758752605 + }, + "competitor": { + "minMs": 47.26999999998952, + "maxMs": 48.669999999998254, + "ratio": 1.0296170932940352 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + } + ], + "excluded": [ + { + "archetype": "split-screen", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "instanced-batch", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-static", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-array", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material-atlased", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + } + ], + "webgl1": [] + }, + { + "backend": "webgpu", + "headlineCount": null, + "competitors": [ + "pixi" + ], + "sections": [ + { + "title": "Node scaling", + "rows": [ + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2999999999999545, + "referenceP95Ms": 0.5599999999999454, + "referenceGpuMs": 0.073834, + "referenceOverFrameBudget": false, + "competitorMs": 0.2599999999999909, + "competitorP95Ms": 0.5, + "competitorGpuMs": 0.07339599999999999, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.2400000000000091, + "maxMs": 0.31999999999982265, + "ratio": 1.333333333332544 + }, + "competitor": { + "minMs": 0.2400000000000091, + "maxMs": 0.30000000000012506, + "ratio": 1.2500000000004736 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2199999999997999, + "referenceP95Ms": 0.42000000000007276, + "referenceGpuMs": 0.136584, + "referenceOverFrameBudget": false, + "competitorMs": 0.20000000000027285, + "competitorP95Ms": 0.36000000000012733, + "competitorGpuMs": 0.130375, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.099999999997499, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000030923, + "maxMs": 0.2300000000000182, + "ratio": 1.4374999999973355 + }, + "competitor": { + "minMs": 0.18000000000029104, + "maxMs": 0.2199999999997999, + "ratio": 1.2222222222191343 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.3000000000001819, + "referenceGpuMs": 0.207187, + "referenceOverFrameBudget": false, + "competitorMs": 0.17000000000007276, + "competitorP95Ms": 0.3400000000001455, + "competitorGpuMs": 0.1905, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0588235294130235, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.15999999999985448, + "maxMs": 0.1999999999998181, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.16000000000076398, + "maxMs": 0.2000000000007276, + "ratio": 1.249999999998579 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.15999999999985448, + "referenceP95Ms": 0.27999999999974534, + "referenceGpuMs": 0.28375, + "referenceOverFrameBudget": false, + "competitorMs": 0.1799999999998363, + "competitorP95Ms": 0.3000000000001819, + "competitorGpuMs": 0.237937, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 + }, + "competitor": { + "minMs": 0.17000000000007276, + "maxMs": 0.1999999999998181, + "ratio": 1.1764705882337205 + }, + "stable": false, + "rungs": [ + "level", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.13999999999987267, + "referenceP95Ms": 0.3000000000001819, + "referenceGpuMs": 0.54425, + "referenceOverFrameBudget": false, + "competitorMs": 0.13000000000010914, + "competitorP95Ms": 0.3000000000001819, + "competitorGpuMs": 0.239875, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1000000000003638, + "maxMs": 0.169999999999618, + "ratio": 1.6999999999899955 + }, + "competitor": { + "minMs": 0.1299999999996544, + "maxMs": 0.13999999999987267, + "ratio": 1.0769230769249605 + }, + "stable": false, + "rungs": [ + "level", + "competitor-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.38000000000010914, + "referenceP95Ms": 0.5600000000004002, + "referenceGpuMs": 0.07175, + "referenceOverFrameBudget": false, + "competitorMs": 0.2800000000002001, + "competitorP95Ms": 0.5, + "competitorGpuMs": 0.073333, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.31999999999970896, + "maxMs": 0.3999999999996362, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.27999999999974534, + "maxMs": 0.32000000000152795, + "ratio": 1.1428571428636392 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1, + "referenceP95Ms": 1.359999999998763, + "referenceGpuMs": 0.137208, + "referenceOverFrameBudget": false, + "competitorMs": 0.6899999999995998, + "competitorP95Ms": 1.1599999999998545, + "competitorGpuMs": 0.13014599999999998, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.449275362319681, + "factor": 1.449275362319681, + "label": "competitor leads (1.45x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.9399999999995998, + "maxMs": 1.0399999999999636, + "ratio": 1.1063829787238366 + }, + "competitor": { + "minMs": 0.6599999999998545, + "maxMs": 0.8200000000006185, + "ratio": 1.2424242424254535 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.7999999999992724, + "referenceP95Ms": 2.3400000000001455, + "referenceGpuMs": 0.208, + "referenceOverFrameBudget": false, + "competitorMs": 1.1199999999998909, + "competitorP95Ms": 1.7800000000006548, + "competitorGpuMs": 0.1921665, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.607142857142364, + "factor": 1.607142857142364, + "label": "competitor leads (1.61x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.7399999999997817, + "maxMs": 1.860000000000582, + "ratio": 1.068965517241848 + }, + "competitor": { + "minMs": 1.1000000000003638, + "maxMs": 1.230000000000473, + "ratio": 1.1181818181818783 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.680000000000291, + "referenceP95Ms": 6.539999999999054, + "referenceGpuMs": 0.283937, + "referenceOverFrameBudget": false, + "competitorMs": 2.25, + "competitorP95Ms": 4.420000000000073, + "competitorGpuMs": 0.236375, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.5600000000004, + "maxMs": 3.019999999999527, + "ratio": 1.179687499999631 + }, + "competitor": { + "minMs": 1.9700000000002547, + "maxMs": 2.5100000000011278, + "ratio": 1.2741116751273114 + }, + "stable": false, + "rungs": [ + "level", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 4.639999999999418, + "referenceP95Ms": 8.039999999999054, + "referenceGpuMs": 0.9888334999999999, + "referenceOverFrameBudget": false, + "competitorMs": 4.779999999999745, + "competitorP95Ms": 7.139999999999418, + "competitorGpuMs": 0.8068335, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.260000000000218, + "maxMs": 4.779999999999745, + "ratio": 1.1220657276994133 + }, + "competitor": { + "minMs": 3.5800000000008367, + "maxMs": 5.089999999999236, + "ratio": 1.421787709496661 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.5599999999994907, + "referenceP95Ms": 2, + "referenceGpuMs": 0.074271, + "referenceOverFrameBudget": false, + "competitorMs": 0.8800000000010186, + "competitorP95Ms": 1.2000000000007276, + "competitorGpuMs": 0.073438, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.772727272724642, + "factor": 1.772727272724642, + "label": "competitor leads (1.77x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.3299999999990177, + "maxMs": 1.6599999999998545, + "ratio": 1.248120300752692 + }, + "competitor": { + "minMs": 0.8400000000001455, + "maxMs": 1, + "ratio": 1.1904761904759842 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 3.9200000000018917, + "referenceP95Ms": 10.260000000002037, + "referenceGpuMs": 0.209812, + "referenceOverFrameBudget": false, + "competitorMs": 2.8699999999989814, + "competitorP95Ms": 10.680000000000291, + "competitorGpuMs": 0.1947085, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3658536585377292, + "factor": 1.3658536585377292, + "label": "competitor leads (1.37x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 3.7999999999992724, + "maxMs": 3.9500000000007276, + "ratio": 1.039473684210917 + }, + "competitor": { + "minMs": 2.8699999999989814, + "maxMs": 2.890000000001237, + "ratio": 1.006968641115771 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 38.169999999998254, + "referenceP95Ms": 42.94000000000233, + "referenceGpuMs": 0.977417, + "referenceOverFrameBudget": true, + "competitorMs": 29.850000000000364, + "competitorP95Ms": 33.20000000000073, + "competitorGpuMs": 0.541917, + "competitorOverFrameBudget": true, + "verdict": { + "side": "competitor", + "ratio": 1.2787269681741302, + "factor": 1.2787269681741302, + "label": "competitor leads (1.28x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 37.75, + "maxMs": 38.31000000000131, + "ratio": 1.0148344370861273 + }, + "competitor": { + "minMs": 28.239999999997963, + "maxMs": 30.31000000000131, + "ratio": 1.0733002832862428 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.2999999999992724, + "referenceGpuMs": 0.0689165, + "referenceOverFrameBudget": false, + "competitorMs": 0.18000000000029104, + "competitorP95Ms": 0.3600000000005821, + "competitorGpuMs": 0.06922900000000001, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 + }, + "competitor": { + "minMs": 0.18000000000029104, + "maxMs": 0.2599999999983993, + "ratio": 1.444444444433216 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.27999999999883585, + "referenceP95Ms": 0.4000000000014552, + "referenceGpuMs": 0.13927050000000002, + "referenceOverFrameBudget": false, + "competitorMs": 0.31999999999970896, + "competitorP95Ms": 0.5, + "competitorGpuMs": 0.13375, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.25, + "maxMs": 0.28000000000065484, + "ratio": 1.1200000000026193 + }, + "competitor": { + "minMs": 0.3000000000029104, + "maxMs": 0.3600000000005821, + "ratio": 1.1999999999902988 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "nodes", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.4599999999991269, + "referenceP95Ms": 0.6599999999998545, + "referenceGpuMs": 0.229479, + "referenceOverFrameBudget": false, + "competitorMs": 0.4599999999991269, + "competitorP95Ms": 0.7000000000007276, + "competitorGpuMs": 0.2201665, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.38000000000101863, + "maxMs": 0.4599999999991269, + "ratio": 1.210526315783931 + }, + "competitor": { + "minMs": 0.42000000000189175, + "maxMs": 0.5299999999988358, + "ratio": 1.2619047618963062 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.8800000000010186, + "referenceP95Ms": 1.2600000000020373, + "referenceGpuMs": 0.292167, + "referenceOverFrameBudget": false, + "competitorMs": 1.1299999999991996, + "competitorP95Ms": 1.7199999999975262, + "competitorGpuMs": 0.2570835, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.8799999999973807, + "maxMs": 0.9000000000014552, + "ratio": 1.0227272727319705 + }, + "competitor": { + "minMs": 1.0599999999994907, + "maxMs": 1.1899999999986903, + "ratio": 1.1226415094332662 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.9899999999979627, + "referenceP95Ms": 3.0599999999976717, + "referenceGpuMs": 0.39316700000000004, + "referenceOverFrameBudget": false, + "competitorMs": 1.359999999998763, + "competitorP95Ms": 2.039999999997235, + "competitorGpuMs": 0.7960625, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.7279411764697523, + "factor": 1.3737373737389513, + "label": "ExoJS leads (1.37x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.9600000000009459, + "maxMs": 1.0199999999986176, + "ratio": 1.062499999997513 + }, + "competitor": { + "minMs": 1.3400000000001455, + "maxMs": 1.7399999999997817, + "ratio": 1.2985074626862632 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.0500000000029104, + "referenceP95Ms": 2.7400000000052387, + "referenceGpuMs": 0.0729585, + "referenceOverFrameBudget": false, + "competitorMs": 1.680000000007567, + "competitorP95Ms": 2.3800000000046566, + "competitorGpuMs": 0.0718955, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/4 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.8299999999944703, + "maxMs": 2.0899999999965075, + "ratio": 1.142076502733783 + }, + "competitor": { + "minMs": 1.6200000000098953, + "maxMs": 1.7299999999959255, + "ratio": 1.0679012345588632 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 3.3100000000049477, + "referenceP95Ms": 7.179999999993015, + "referenceGpuMs": 0.144021, + "referenceOverFrameBudget": false, + "competitorMs": 2.459999999999127, + "competitorP95Ms": 7.8399999999965075, + "competitorGpuMs": 0.157792, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3455284552870417, + "factor": 1.3455284552870417, + "label": "competitor leads (1.35x)", + "structural": false + }, + "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 3.0899999999965075, + "maxMs": 3.3100000000122236, + "ratio": 1.0711974110084028 + }, + "competitor": { + "minMs": 2.4200000000055297, + "maxMs": 2.4899999999979627, + "ratio": 1.0289256198315178 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 25000, + "loadId": "25k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 12.459999999991851, + "referenceP95Ms": 14.64000000001397, + "referenceGpuMs": 0.28641649999999996, + "referenceOverFrameBudget": false, + "competitorMs": 10.490000000005239, + "competitorP95Ms": 12.819999999992433, + "competitorGpuMs": 0.308354, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.1877979027631675, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.75, + "maxMs": 12.799999999988358, + "ratio": 1.0893617021266688 + }, + "competitor": { + "minMs": 10.450000000004366, + "maxMs": 10.89999999999418, + "ratio": 1.043062200955945 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + } + ] + }, + { + "title": "Fill and GPU state", + "rows": [ + { + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 1000, + "loadId": "1k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.11999999999898137, + "referenceP95Ms": 0.2000000000007276, + "referenceGpuMs": 9.989729, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.31999999999970896, + "competitorGpuMs": 10.3997505, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.09999999999854481, + "maxMs": 0.12000000000261934, + "ratio": 1.2000000000436557 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.17999999999847205, + "ratio": 1.2857142857087174 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.020000000000436557, + "referenceP95Ms": 0.06000000000494765, + "referenceGpuMs": 278.964875, + "referenceOverFrameBudget": false, + "competitorMs": 0.040000000000873115, + "competitorP95Ms": 0.07999999999810825, + "competitorGpuMs": 52.685083500000005, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5, + "factor": 2, + "label": "ExoJS leads (2.00x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.020000000000436557, + "maxMs": 0.020000000000436557, + "ratio": 1 + }, + "competitor": { + "minMs": 0.039999999997235136, + "maxMs": 0.040000000000873115, + "ratio": 1.0000000000909495 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "overdraw", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", + "unit": "nodes", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.029999999998835847, + "referenceP95Ms": 0.09999999999854481, + "referenceGpuMs": 1393.6619375, + "referenceOverFrameBudget": false, + "competitorMs": 0.08000000000174623, + "competitorP95Ms": 0.13999999999941792, + "competitorGpuMs": 263.568896, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.37499999997726263, + "factor": 2.6666666668283545, + "label": "ExoJS leads (2.67x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.029999999998835847, + "maxMs": 0.040000000000873115, + "ratio": 1.3333333334141773 + }, + "competitor": { + "minMs": 0.07999999999447027, + "maxMs": 0.09999999999854481, + "ratio": 1.250000000068212 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 8, + "loadId": "8", + "unit": "layers", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.22000000000116415, + "referenceGpuMs": 0.2794375, + "referenceOverFrameBudget": false, + "competitorMs": 0.16000000000349246, + "competitorP95Ms": 0.33999999999650754, + "competitorGpuMs": 0.1636665, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.09999999999854481, + "maxMs": 0.13999999999941792, + "ratio": 1.4000000000145518 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 32, + "loadId": "32", + "unit": "layers", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.22000000000116415, + "referenceGpuMs": 1.3240625000000001, + "referenceOverFrameBudget": false, + "competitorMs": 0.16000000000349246, + "competitorP95Ms": 0.2999999999956344, + "competitorGpuMs": 1.3710415, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.09999999999854481, + "maxMs": 0.13999999999941792, + "ratio": 1.4000000000145518 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 128, + "loadId": "128", + "unit": "layers", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.12000000000261934, + "referenceP95Ms": 0.20000000000436557, + "referenceGpuMs": 2.7205, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.27999999999883585, + "competitorGpuMs": 2.385604, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.09999999999854481, + "maxMs": 0.13999999999941792, + "ratio": 1.4000000000145518 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.4599999999954889, + "referenceP95Ms": 0.6399999999994179, + "referenceGpuMs": 0.0800835, + "referenceOverFrameBudget": false, + "competitorMs": 0.31999999999970896, + "competitorP95Ms": 0.5, + "competitorGpuMs": 0.064583, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.4374999999872102, + "factor": 1.4374999999872102, + "label": "competitor leads (1.44x)", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (126 vs 64 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.41999999999825377, + "maxMs": 0.5299999999988358, + "ratio": 1.2619047619072368 + }, + "competitor": { + "minMs": 0.3100000000013097, + "maxMs": 0.31999999999970896, + "ratio": 1.0322580645108292 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.680000000000291, + "referenceP95Ms": 1.5, + "referenceGpuMs": 0.221375, + "referenceOverFrameBudget": false, + "competitorMs": 0.7000000000116415, + "competitorP95Ms": 1.040000000008149, + "competitorGpuMs": 0.07725, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (626 vs 314 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4900000000052387, + "maxMs": 0.8999999999941792, + "ratio": 1.836734693846035 + }, + "competitor": { + "minMs": 0.6700000000055297, + "maxMs": 0.8000000000029104, + "ratio": 1.1940298507407578 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "level", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.7300000000032014, + "referenceP95Ms": 2.4399999999877764, + "referenceGpuMs": 0.4673335, + "referenceOverFrameBudget": false, + "competitorMs": 1.319999999999709, + "competitorP95Ms": 1.7599999999947613, + "competitorGpuMs": 0.14443699999999998, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3106060606087748, + "factor": 1.3106060606087748, + "label": "competitor leads (1.31x)", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (3126 vs 1564 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.6899999999950523, + "maxMs": 1.7599999999947613, + "ratio": 1.0414201183431444 + }, + "competitor": { + "minMs": 1.2799999999988358, + "maxMs": 1.3399999999965075, + "ratio": 1.0468749999982236 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.19999999999708962, + "referenceP95Ms": 0.27999999999883585, + "referenceGpuMs": 0.06393750000000001, + "referenceOverFrameBudget": false, + "competitorMs": 0.22000000000116415, + "competitorP95Ms": 0.3799999999901047, + "competitorGpuMs": 0.0632085, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (52 vs 33 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16999999999825377, + "maxMs": 0.20000000001164153, + "ratio": 1.1764705883158584 + }, + "competitor": { + "minMs": 0.22000000000116415, + "maxMs": 0.2599999999947613, + "ratio": 1.181818181788116 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.46000000000640284, + "referenceP95Ms": 0.5999999999912689, + "referenceGpuMs": 0.120396, + "referenceOverFrameBudget": false, + "competitorMs": 0.5399999999935972, + "competitorP95Ms": 0.6999999999970896, + "competitorGpuMs": 0.119208, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.8518518518738095, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (240 vs 159 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4499999999970896, + "maxMs": 0.5199999999895226, + "ratio": 1.155555555539746 + }, + "competitor": { + "minMs": 0.5399999999935972, + "maxMs": 0.5599999999976717, + "ratio": 1.0370370370450217 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.6900000000096043, + "referenceP95Ms": 1.1199999999953434, + "referenceGpuMs": 0.447417, + "referenceOverFrameBudget": false, + "competitorMs": 0.9599999999991269, + "competitorP95Ms": 1.2600000000093132, + "competitorGpuMs": 0.12356249999999999, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (1564 vs 783 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.5399999999935972, + "maxMs": 0.8099999999976717, + "ratio": 1.5000000000134739 + }, + "competitor": { + "minMs": 0.9199999999982538, + "maxMs": 0.9800000000032014, + "ratio": 1.0652173913098495 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "exojs-leads", + "level" + ] + } + } + ] + } + ] + }, + { + "title": "Material variety", + "rows": [ + { + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.11999999999534339, + "referenceP95Ms": 0.180000000007567, + "referenceGpuMs": 0.0725625, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.3000000000029104, + "competitorGpuMs": 0.071458, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.08000000000174623, + "maxMs": 0.11999999999534339, + "ratio": 1.4999999999090505 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.16000000000349246, + "ratio": 1.1428571428868406 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.11999999999534339, + "referenceP95Ms": 0.180000000007567, + "referenceGpuMs": 0.1256455, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.3000000000029104, + "competitorGpuMs": 0.1164795, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.09999999999126885, + "maxMs": 0.1200000000098953, + "ratio": 1.2000000002037268 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.14000000000669388, + "ratio": 1.000000000051971 + }, + "stable": false, + "rungs": [ + "level", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.10000000000582077, + "referenceP95Ms": 0.22000000000116415, + "referenceGpuMs": 0.287729, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.22000000000116415, + "competitorGpuMs": 0.24162499999999998, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.08999999999650754, + "maxMs": 0.1300000000046566, + "ratio": 1.4444444445522364 + }, + "competitor": { + "minMs": 0.1200000000098953, + "maxMs": 0.15999999998894054, + "ratio": 1.3333333331312234 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Text", + "rows": [ + { + "archetype": "text-static", + "category": "Text", + "count": 200, + "loadId": "200", + "unit": "labels", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.16000000000349246, + "referenceP95Ms": 0.28000000001338776, + "referenceGpuMs": 0.375, + "referenceOverFrameBudget": false, + "competitorMs": 0.16000000000349246, + "competitorP95Ms": 0.3000000000029104, + "competitorGpuMs": 0.093958, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.13999999999941792, + "maxMs": 0.16000000000349246, + "ratio": 1.1428571428868406 + }, + "competitor": { + "minMs": 0.15999999998894054, + "maxMs": 0.16000000000349246, + "ratio": 1.0000000000909495 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "text-static", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.22000000000116415, + "referenceGpuMs": 0.6398539999999999, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.3000000000029104, + "competitorGpuMs": 0.2474375, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.10000000000582077, + "maxMs": 0.13999999999941792, + "ratio": 1.3999999999126884 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.16999999999825377, + "ratio": 1.21428571427829 + }, + "stable": false, + "rungs": [ + "level", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "text-static", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.23999999999068677, + "referenceGpuMs": 3.4404375, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.3200000000069849, + "competitorGpuMs": 0.658542, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.11999999999534339, + "maxMs": 0.15999999998894054, + "ratio": 1.3333333332929114 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.16000000000349246, + "ratio": 1.1428571428868406 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 200, + "loadId": "200", + "unit": "labels", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.5599999999976717, + "referenceP95Ms": 2.040000000008149, + "referenceGpuMs": 0.3950415, + "referenceOverFrameBudget": false, + "competitorMs": 2.6999999999970896, + "competitorP95Ms": 3.779999999998836, + "competitorGpuMs": 0.106917, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5777777777775382, + "factor": 1.7307692307699483, + "label": "ExoJS leads (1.73x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.4899999999979627, + "maxMs": 1.5800000000017462, + "ratio": 1.0604026845663803 + }, + "competitor": { + "minMs": 2.5200000000040745, + "maxMs": 2.6999999999970896, + "ratio": 1.0714285714256842 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.779999999998836, + "referenceP95Ms": 8, + "referenceGpuMs": 1.484958, + "referenceOverFrameBudget": false, + "competitorMs": 4.539999999993597, + "competitorP95Ms": 5.980000000010477, + "competitorGpuMs": 0.29041649999999997, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6123348017627217, + "factor": 1.6330935251782368, + "label": "ExoJS leads (1.63x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.6199999999953434, + "maxMs": 3.4799999999959255, + "ratio": 1.3282442748099659 + }, + "competitor": { + "minMs": 4.259999999994761, + "maxMs": 4.599999999991269, + "ratio": 1.0798122065720483 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 7.690000000002328, + "referenceP95Ms": 11.460000000006403, + "referenceGpuMs": 3.8005835, + "referenceOverFrameBudget": false, + "competitorMs": 21.409999999996217, + "competitorP95Ms": 24.839999999996508, + "competitorGpuMs": 0.4530415, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.35917795422716897, + "factor": 2.7841352405708366, + "label": "ExoJS leads (2.78x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 7.269999999996799, + "maxMs": 8.080000000009022, + "ratio": 1.1114167812947153 + }, + "competitor": { + "minMs": 21.05000000000291, + "maxMs": 21.459999999999127, + "ratio": 1.0194774346791524 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Render targets", + "rows": [ + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.4800000000104774, + "referenceP95Ms": 0.7400000000197906, + "referenceGpuMs": 0.2244375, + "referenceOverFrameBudget": false, + "competitorMs": 0.7399999999906868, + "competitorP95Ms": 1.1199999999953434, + "competitorGpuMs": 0.224417, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6486486486709708, + "factor": 1.5416666666136127, + "label": "ExoJS leads (1.54x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4800000000104774, + "maxMs": 0.5, + "ratio": 1.0416666666439294 + }, + "competitor": { + "minMs": 0.6899999999950523, + "maxMs": 0.7400000000052387, + "ratio": 1.0724637681312243 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.360000000015134, + "referenceP95Ms": 0.5400000000081491, + "referenceGpuMs": 0.19037600000000002, + "referenceOverFrameBudget": false, + "competitorMs": 1.9400000000023283, + "competitorP95Ms": 2.720000000001164, + "competitorGpuMs": 0.175291, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.18556701031685666, + "factor": 5.388888888668814, + "label": "ExoJS leads clearly (5.39x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.27999999999883585, + "maxMs": 0.3800000000046566, + "ratio": 1.3571428571651305 + }, + "competitor": { + "minMs": 1.9200000000128057, + "maxMs": 1.9400000000023283, + "ratio": 1.0104166666611403 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.28999999999359716, + "referenceP95Ms": 0.4400000000023283, + "referenceGpuMs": 0.44379250000000003, + "referenceOverFrameBudget": false, + "competitorMs": 3.7299999999959255, + "competitorP95Ms": 6.220000000001164, + "competitorGpuMs": 0.5068754999999999, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.07774798927450775, + "factor": 12.862068965787172, + "label": "ExoJS leads clearly (12.86x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.27999999999883585, + "maxMs": 0.33999999999650754, + "ratio": 1.21428571427829 + }, + "competitor": { + "minMs": 3.3399999999965075, + "maxMs": 3.889999999999418, + "ratio": 1.1646706586836784 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.3799999999755528, + "referenceP95Ms": 0.5599999999976717, + "referenceGpuMs": 0.21800000000000003, + "referenceOverFrameBudget": false, + "competitorMs": 0.7200000000011642, + "competitorP95Ms": 1.0399999999790452, + "competitorGpuMs": 0.3834995, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.52777777774297, + "factor": 1.8947368422302242, + "label": "ExoJS leads (1.89x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.3800000000046566, + "ratio": 1.2666666667313418 + }, + "competitor": { + "minMs": 0.7100000000064028, + "maxMs": 0.7700000000040745, + "ratio": 1.0845070422494798 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.35999999998603016, + "referenceP95Ms": 0.5400000000081491, + "referenceGpuMs": 0.2520835, + "referenceOverFrameBudget": false, + "competitorMs": 1.820000000006985, + "competitorP95Ms": 2.6000000000058208, + "competitorGpuMs": 0.41974999999999996, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.19780219779376293, + "factor": 5.055555555771139, + "label": "ExoJS leads clearly (5.06x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3200000000069849, + "maxMs": 0.3699999999953434, + "ratio": 1.1562499999602096 + }, + "competitor": { + "minMs": 1.7899999999935972, + "maxMs": 1.860000000015134, + "ratio": 1.0391061452635684 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.3100000000122236, + "referenceP95Ms": 0.4599999999918509, + "referenceGpuMs": 0.4919165, + "referenceOverFrameBudget": false, + "competitorMs": 3.5800000000017462, + "competitorP95Ms": 5.5, + "competitorGpuMs": 0.7823125000000001, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.0865921787743219, + "factor": 11.548387096324461, + "label": "ExoJS leads clearly (11.55x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.27999999999883585, + "maxMs": 0.33999999999650754, + "ratio": 1.21428571427829 + }, + "competitor": { + "minMs": 3.389999999984866, + "maxMs": 3.679999999993015, + "ratio": 1.08554572271665 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.35999999998603016, + "referenceP95Ms": 0.5400000000081491, + "referenceGpuMs": 0.368854, + "referenceOverFrameBudget": false, + "competitorMs": 0.7200000000011642, + "competitorP95Ms": 1.0599999999976717, + "competitorGpuMs": 0.768, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.499999999979789, + "factor": 2.000000000080844, + "label": "ExoJS leads (2.00x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.33999999999650754, + "maxMs": 0.3800000000046566, + "ratio": 1.1176470588487057 + }, + "competitor": { + "minMs": 0.6999999999825377, + "maxMs": 0.7200000000011642, + "ratio": 1.0285714285987506 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.3600000000005821, + "referenceP95Ms": 0.5400000000081491, + "referenceGpuMs": 0.37489649999999997, + "referenceOverFrameBudget": false, + "competitorMs": 1.8000000000174623, + "competitorP95Ms": 2.6199999999953434, + "competitorGpuMs": 0.6701254999999999, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.35999999998603016, + "maxMs": 0.39999999999417923, + "ratio": 1.1111111111380592 + }, + "competitor": { + "minMs": 1.7899999999935972, + "maxMs": 1.820000000006985, + "ratio": 1.016759776543852 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "filter-chain-4", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.35999999998603016, + "referenceP95Ms": 0.5599999999976717, + "referenceGpuMs": 0.551437, + "referenceOverFrameBudget": false, + "competitorMs": 3.6900000000023283, + "competitorP95Ms": 5.740000000019791, + "competitorGpuMs": 1.5066665, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.09756097560590868, + "factor": 10.250000000404219, + "label": "ExoJS leads clearly (10.25x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.33999999999650754, + "maxMs": 0.3800000000046566, + "ratio": 1.1176470588487057 + }, + "competitor": { + "minMs": 3.3699999999953434, + "maxMs": 3.8099999999976717, + "ratio": 1.130563798220456 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.40000000002328306, + "referenceP95Ms": 0.6199999999953434, + "referenceGpuMs": 0.23893699999999998, + "referenceOverFrameBudget": false, + "competitorMs": 0.6799999999930151, + "competitorP95Ms": 0.9799999999813735, + "competitorGpuMs": 0.504396, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5882352941579292, + "factor": 1.6999999998835846, + "label": "ExoJS leads (1.70x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.34000000001105946, + "maxMs": 0.4400000000023283, + "ratio": 1.2941176470235767 + }, + "competitor": { + "minMs": 0.6699999999982538, + "maxMs": 0.8000000000174623, + "ratio": 1.1940298507754439 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.41999999998370185, + "referenceP95Ms": 0.6199999999953434, + "referenceGpuMs": 0.3317915, + "referenceOverFrameBudget": false, + "competitorMs": 0.5799999999871943, + "competitorP95Ms": 0.8800000000046566, + "competitorGpuMs": 0.5939585000000001, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.7241379310223706, + "factor": 1.3809523809754793, + "label": "ExoJS leads (1.38x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3800000000046566, + "maxMs": 0.4400000000023283, + "ratio": 1.1578947368340433 + }, + "competitor": { + "minMs": 0.5799999999871943, + "maxMs": 0.6199999999953434, + "ratio": 1.068965517256952 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.41999999999825377, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 0.5701255, + "referenceOverFrameBudget": false, + "competitorMs": 0.47999999999592546, + "competitorP95Ms": 0.7399999999906868, + "competitorGpuMs": 0.5002905, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3800000000046566, + "maxMs": 0.42999999997846317, + "ratio": 1.1315789472978786 + }, + "competitor": { + "minMs": 0.4499999999970896, + "maxMs": 0.5500000000029104, + "ratio": 1.2222222222365944 + }, + "stable": false, + "rungs": [ + "level", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.3200000000069849, + "referenceP95Ms": 0.4800000000104774, + "referenceGpuMs": 0.200146, + "referenceOverFrameBudget": false, + "competitorMs": 0.27999999999883585, + "competitorP95Ms": 0.4200000000128057, + "competitorGpuMs": 0.08972949999999999, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.33999999999650754, + "ratio": 1.133333333365671 + }, + "competitor": { + "minMs": 0.2599999999802094, + "maxMs": 0.27999999999883585, + "ratio": 1.0769230770005724 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.29999999998835847, + "referenceP95Ms": 0.4400000000023283, + "referenceGpuMs": 0.31610550000000004, + "referenceOverFrameBudget": false, + "competitorMs": 0.2599999999802094, + "competitorP95Ms": 0.4200000000128057, + "competitorGpuMs": 0.1555205, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.29999999998835847, + "ratio": 1 + }, + "competitor": { + "minMs": 0.23999999999068677, + "maxMs": 0.27000000000407454, + "ratio": 1.125000000060633 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.27999999999883585, + "referenceP95Ms": 0.4400000000023283, + "referenceGpuMs": 0.39139599999999997, + "referenceOverFrameBudget": false, + "competitorMs": 0.22999999999592546, + "competitorP95Ms": 0.39999999999417923, + "competitorGpuMs": 0.3158955, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.22999999999592546, + "maxMs": 0.3000000000174623, + "ratio": 1.3043478261859867 + }, + "competitor": { + "minMs": 0.20000000001164153, + "maxMs": 0.2600000000093132, + "ratio": 1.2999999999708962 + }, + "stable": false, + "rungs": [ + "level", + "competitor-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 360, + "loadId": "360", + "unit": "viewport", + "primary": false, + "label": "640 x 360", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.360000000015134, + "referenceP95Ms": 0.5199999999895226, + "referenceGpuMs": 0.167626, + "referenceOverFrameBudget": false, + "competitorMs": 0.39999999999417923, + "competitorP95Ms": 0.639999999984866, + "competitorGpuMs": 0.2516255, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9000000000509317, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.360000000015134, + "maxMs": 0.3799999999901047, + "ratio": 1.0555555554836942 + }, + "competitor": { + "minMs": 0.3800000000046566, + "maxMs": 0.40000000000873115, + "ratio": 1.0526315789574459 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 720, + "loadId": "720", + "unit": "viewport", + "primary": true, + "label": "1280 x 720", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.360000000015134, + "referenceP95Ms": 0.5199999999895226, + "referenceGpuMs": 0.30943750000000003, + "referenceOverFrameBudget": false, + "competitorMs": 0.360000000015134, + "competitorP95Ms": 0.5999999999767169, + "competitorGpuMs": 0.5895005, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3200000000069849, + "maxMs": 0.3800000000046566, + "ratio": 1.1874999999886313 + }, + "competitor": { + "minMs": 0.33999999999650754, + "maxMs": 0.360000000015134, + "ratio": 1.0588235294671526 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "fx-blur", + "category": "Render targets", + "count": 1080, + "loadId": "1080", + "unit": "viewport", + "primary": false, + "label": "1920 x 1080", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.35999999998603016, + "referenceP95Ms": 0.5, + "referenceGpuMs": 0.4663345, + "referenceOverFrameBudget": false, + "competitorMs": 0.33999999999650754, + "competitorP95Ms": 0.5800000000162981, + "competitorGpuMs": 0.5912715, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.058823529381553, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3000000000174623, + "maxMs": 0.3800000000046566, + "ratio": 1.266666666608459 + }, + "competitor": { + "minMs": 0.33999999999650754, + "maxMs": 0.3699999999953434, + "ratio": 1.0882352941151294 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.33999999999650754, + "referenceP95Ms": 0.5200000000186265, + "referenceGpuMs": 0.20310350000000002, + "referenceOverFrameBudget": false, + "competitorMs": 0.27999999999883585, + "competitorP95Ms": 0.46000000002095476, + "competitorGpuMs": 0.089583, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.33999999999650754, + "maxMs": 0.4400000000023283, + "ratio": 1.2941176470789646 + }, + "competitor": { + "minMs": 0.27999999999883585, + "maxMs": 0.3099999999976717, + "ratio": 1.1071428571391448 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.33999999999650754, + "referenceP95Ms": 0.46000000002095476, + "referenceGpuMs": 0.264749, + "referenceOverFrameBudget": false, + "competitorMs": 0.33999999999650754, + "competitorP95Ms": 0.5599999999976717, + "competitorGpuMs": 0.155208, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.29999999998835847, + "maxMs": 0.3800000000046566, + "ratio": 1.2666666667313418 + }, + "competitor": { + "minMs": 0.33000000000174623, + "maxMs": 0.3600000000005821, + "ratio": 1.090909090905082 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.33000000000174623, + "referenceP95Ms": 0.4800000000104774, + "referenceGpuMs": 0.4809785, + "referenceOverFrameBudget": false, + "competitorMs": 1.0099999999947613, + "competitorP95Ms": 1.3800000000046566, + "competitorGpuMs": 0.1784375, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.3267326732707504, + "factor": 3.06060606057399, + "label": "ExoJS leads (3.06x)", + "structural": false + }, + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.3200000000069849, + "maxMs": 0.3699999999953434, + "ratio": 1.1562499999602096 + }, + "competitor": { + "minMs": 0.9299999999930151, + "maxMs": 1.0399999999790452, + "ratio": 1.11827956987834 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Camera and world", + "rows": [ + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22000000000116415, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 0.054291, + "referenceOverFrameBudget": false, + "competitorMs": 0.16000000000349246, + "competitorP95Ms": 0.319999999992433, + "competitorGpuMs": 0.060146, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3749999999772626, + "factor": 1.3749999999772626, + "label": "competitor leads (1.37x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.19999999999708962, + "maxMs": 0.2599999999947613, + "ratio": 1.299999999992724 + }, + "competitor": { + "minMs": 0.16000000000349246, + "maxMs": 0.16000000000349246, + "ratio": 1 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.17999999999301508, + "referenceP95Ms": 1.3000000000029104, + "referenceGpuMs": 0.0810415, + "referenceOverFrameBudget": false, + "competitorMs": 0.16000000000349246, + "competitorP95Ms": 0.3000000000029104, + "competitorGpuMs": 0.081167, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.124999999931788, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.15999999998894054, + "maxMs": 0.180000000007567, + "ratio": 1.1250000001250555 + }, + "competitor": { + "minMs": 0.16000000000349246, + "maxMs": 0.180000000007567, + "ratio": 1.1250000000227374 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.180000000007567, + "referenceP95Ms": 1.2799999999988358, + "referenceGpuMs": 0.10025, + "referenceOverFrameBudget": false, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.27999999999883585, + "competitorGpuMs": 0.098687, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.1300000000046566, + "maxMs": 0.19999999999708962, + "ratio": 1.538461538384043 + }, + "competitor": { + "minMs": 0.13999999999941792, + "maxMs": 0.16000000000349246, + "ratio": 1.1428571428868406 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 25000, + "loadId": "25k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.17999999999301508, + "referenceP95Ms": 1.5800000000017462, + "referenceGpuMs": 0.173188, + "referenceOverFrameBudget": false, + "competitorMs": 0.1300000000046566, + "competitorP95Ms": 0.22000000000116415, + "competitorGpuMs": 0.179417, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3846153845120575, + "factor": 1.3846153845120575, + "label": "competitor leads (1.38x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (60 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000349246, + "maxMs": 0.18000000000029104, + "ratio": 1.1249999999772626 + }, + "competitor": { + "minMs": 0.12000000000261934, + "maxMs": 0.13999999999941792, + "ratio": 1.16666666663635 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.16000000000349246, + "referenceP95Ms": 2.680000000007567, + "referenceGpuMs": 0.30504149999999997, + "referenceOverFrameBudget": false, + "competitorMs": 0.08999999999650754, + "competitorP95Ms": 0.23999999999068677, + "competitorGpuMs": 0.33270849999999996, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.7777777778855697, + "factor": 1.7777777778855697, + "label": "competitor leads (1.78x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.16000000000349246, + "maxMs": 0.19999999999708962, + "ratio": 1.2499999999545253 + }, + "competitor": { + "minMs": 0.08999999999650754, + "maxMs": 0.11999999999534339, + "ratio": 1.3333333333333333 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Tilemaps", + "rows": [ + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2400000000197906, + "referenceP95Ms": 1.2600000000093132, + "referenceGpuMs": 0.0690835, + "referenceOverFrameBudget": false, + "competitorMs": 0.35999999998603016, + "competitorP95Ms": 0.6600000000034925, + "competitorGpuMs": 0.08525, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "ExoJS issues fewer buffer uploads (326 vs 652 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.20000000001164153, + "maxMs": 0.2600000000093132, + "ratio": 1.2999999999708962 + }, + "competitor": { + "minMs": 0.3000000000174623, + "maxMs": 0.3800000000046566, + "ratio": 1.266666666608459 + }, + "stable": false, + "rungs": [ + "exojs-leads", + "level", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.22999999999592546, + "referenceP95Ms": 1.4799999999813735, + "referenceGpuMs": 0.068104, + "referenceOverFrameBudget": false, + "competitorMs": 0.33999999999650754, + "competitorP95Ms": 0.5400000000081491, + "competitorGpuMs": 0.07856250000000001, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6764705882302589, + "factor": 1.4782608695762207, + "label": "ExoJS leads (1.48x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (60 vs 2 per frame)", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.14000000001396984, + "maxMs": 0.23999999999068677, + "ratio": 1.714285714048132 + }, + "competitor": { + "minMs": 0.2600000000093132, + "maxMs": 0.33999999999650754, + "ratio": 1.3076923076320335 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.1199999999953434, + "referenceP95Ms": 2.4800000000104774, + "referenceGpuMs": 0.0673955, + "referenceOverFrameBudget": false, + "competitorMs": 2.4800000000104774, + "competitorP95Ms": 3.1599999999743886, + "competitorGpuMs": 0.067917, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.45161290322202086, + "factor": 2.214285714304275, + "label": "ExoJS leads (2.21x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.0099999999947613, + "maxMs": 1.1299999999901047, + "ratio": 1.1188118811841246 + }, + "competitor": { + "minMs": 2.4400000000023283, + "maxMs": 2.539999999993597, + "ratio": 1.0409836065537597 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.8000000000029104, + "referenceP95Ms": 1.3800000000046566, + "referenceGpuMs": 0.0675415, + "referenceOverFrameBudget": false, + "competitorMs": 1.5200000000040745, + "competitorP95Ms": 2.8399999999965075, + "competitorGpuMs": 0.069521, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5263157894741881, + "factor": 1.899999999998181, + "label": "ExoJS leads (1.90x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.5500000000029104, + "maxMs": 1.0399999999935972, + "ratio": 1.8909090908874435 + }, + "competitor": { + "minMs": 1.3099999999976717, + "maxMs": 1.7899999999935972, + "ratio": 1.3664122137379988 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Particles", + "rows": [ + { + "archetype": "particles-draw", + "category": "Particles", + "count": 1000, + "loadId": "1k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.27999999999883585, + "referenceP95Ms": 0.41999999998370185, + "referenceGpuMs": 0.07108300000000001, + "referenceOverFrameBudget": false, + "competitorMs": 0.20000000001164153, + "competitorP95Ms": 0.41999999998370185, + "competitorGpuMs": 0.0697915, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.29999999998835847, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.1999999999825377, + "maxMs": 0.20000000001164153, + "ratio": 1.0000000001455192 + }, + "stable": false, + "rungs": [ + "competitor-leads", + "competitor-leads", + "level" + ] + } + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.4800000000104774, + "referenceP95Ms": 0.6000000000058208, + "referenceGpuMs": 0.143458, + "referenceOverFrameBudget": false, + "competitorMs": 0.17999999999301508, + "competitorP95Ms": 0.35999999998603016, + "competitorGpuMs": 0.23391650000000003, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.6666666668283545, + "factor": 2.6666666668283545, + "label": "competitor leads (2.67x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.4599999999918509, + "maxMs": 0.4900000000052387, + "ratio": 1.065217391334607 + }, + "competitor": { + "minMs": 0.17999999999301508, + "maxMs": 0.1900000000023283, + "ratio": 1.0555555556094516 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.139999999999418, + "referenceP95Ms": 2.6999999999825377, + "referenceGpuMs": 0.2797085, + "referenceOverFrameBudget": false, + "competitorMs": 0.23999999999068677, + "competitorP95Ms": 0.34000000002561137, + "competitorGpuMs": 0.224688, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 8.916666667010254, + "factor": 8.916666667010254, + "label": "competitor leads clearly (8.92x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.0199999999895226, + "maxMs": 2.2599999999947613, + "ratio": 1.1188118811913286 + }, + "competitor": { + "minMs": 0.22999999999592546, + "maxMs": 0.2500000000145519, + "ratio": 1.0869565218216555 + }, + "stable": true, + "rungs": [ + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 1000, + "loadId": "1k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2800000000279397, + "referenceP95Ms": 0.4200000000128057, + "referenceGpuMs": 0.06852050000000001, + "referenceOverFrameBudget": false, + "competitorMs": 0.27999999999883585, + "competitorP95Ms": 0.47999999998137355, + "competitorGpuMs": 0.069458, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0000000001039422, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.29999999998835847, + "ratio": 1.25 + }, + "competitor": { + "minMs": 0.27999999999883585, + "maxMs": 0.2900000000081491, + "ratio": 1.0357142857476958 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.6399999999994179, + "referenceP95Ms": 0.7799999999988358, + "referenceGpuMs": 0.22835450000000002, + "referenceOverFrameBudget": false, + "competitorMs": 0.9199999999837019, + "competitorP95Ms": 1.180000000022119, + "competitorGpuMs": 0.228187, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6956521739247346, + "factor": 1.4374999999758415, + "label": "ExoJS leads (1.44x)", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.569999999992433, + "maxMs": 0.6600000000034925, + "ratio": 1.157894736863604 + }, + "competitor": { + "minMs": 0.860000000015134, + "maxMs": 0.9700000000157161, + "ratio": 1.127906976742612 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.8299999999871943, + "referenceP95Ms": 3.3000000000174623, + "referenceGpuMs": 0.2167715, + "referenceOverFrameBudget": false, + "competitorMs": 2.679999999993015, + "competitorP95Ms": 4.100000000005821, + "competitorGpuMs": 0.77525, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.8099999999976717, + "maxMs": 2.0599999999976717, + "ratio": 1.1381215469615036 + }, + "competitor": { + "minMs": 1.889999999999418, + "maxMs": 2.889999999999418, + "ratio": 1.529100529100692 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + }, + { + "title": "Interaction", + "rows": [ + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "rects", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.2600000000093132, + "referenceP95Ms": 0.41999999998370185, + "referenceGpuMs": 0.073354, + "referenceOverFrameBudget": false, + "competitorMs": 5.110000000000582, + "competitorP95Ms": 6.7000000000116415, + "competitorGpuMs": 0.0757915, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.05088062622490873, + "factor": 19.65384615314439, + "label": "ExoJS leads clearly (19.65x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.23999999999068677, + "maxMs": 0.29999999998835847, + "ratio": 1.25 + }, + "competitor": { + "minMs": 4.939999999987776, + "maxMs": 5.259999999980209, + "ratio": 1.0647773279338513 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 10000, + "loadId": "10k", + "unit": "rects", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.569999999992433, + "referenceP95Ms": 0.8399999999965075, + "referenceGpuMs": 0.1790205, + "referenceOverFrameBudget": false, + "competitorMs": 16.70000000001164, + "competitorP95Ms": 21.920000000012806, + "competitorGpuMs": 0.294459, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.034131736526469204, + "factor": 29.298245614444454, + "label": "ExoJS leads clearly (29.30x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.41999999998370185, + "maxMs": 0.5799999999871943, + "ratio": 1.3809523809754791 + }, + "competitor": { + "minMs": 16.569999999992433, + "maxMs": 17.579999999987194, + "ratio": 1.060953530476477 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 100, + "loadId": "100", + "unit": "widgets", + "primary": false, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 2.8399999999965075, + "referenceP95Ms": 3.64000000001397, + "referenceGpuMs": 0.034271, + "referenceOverFrameBudget": false, + "competitorMs": 5.919999999983702, + "competitorP95Ms": 6.779999999998836, + "competitorGpuMs": 0.036312, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.4797297297304605, + "factor": 2.0845070422503458, + "label": "ExoJS leads (2.08x)", + "structural": false + }, + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.8300000000017462, + "maxMs": 2.9199999999982538, + "ratio": 1.031802120140089 + }, + "competitor": { + "minMs": 5.80999999998312, + "maxMs": 5.959999999991851, + "ratio": 1.0258175559396157 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + }, + { + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "widgets", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 21.630000000004657, + "referenceP95Ms": 44.55999999999767, + "referenceGpuMs": 0.033938, + "referenceOverFrameBudget": true, + "competitorMs": 49.669999999998254, + "competitorP95Ms": 64.16000000000349, + "competitorGpuMs": 0.033917, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.4354741292531793, + "factor": 2.296347665279129, + "label": "ExoJS leads (2.30x)", + "structural": false + }, + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.410000000003492, + "maxMs": 22.639999999999418, + "ratio": 2.174831892410358 + }, + "competitor": { + "minMs": 49.4199999999837, + "maxMs": 49.830000000001746, + "ratio": 1.0082962363419299 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + } + ] + } + ] + } + ], + "excluded": [ + { + "archetype": "split-screen", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "instanced-batch", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-static", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-array", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, { "archetype": "mixed-material-atlased", "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" @@ -5235,355 +11879,2519 @@ "physics": { "runs": [ { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" + }, + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" + }, + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.01999999999999602, + "crossOriginIsolated": true + }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-12T15:12:06.707Z" + }, + { + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" + }, + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" + }, + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.01999999999999602, + "crossOriginIsolated": true + }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-12T15:20:04.834Z" + }, + { + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" + }, + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" + }, + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.01999999999999602, + "crossOriginIsolated": true + }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-12T15:28:04.015Z" + } + ], + "libraries": [ + { + "name": "@codexo/exojs-physics", + "version": "0.17.0" + }, + { + "name": "matter-js", + "version": "0.20.0" + }, + { + "name": "planck", + "version": "1.5.0" + }, + { + "name": "@dimforge/rapier2d-compat", + "version": "0.19.3" + }, + { + "name": "@newkrok/nape-js", + "version": "3.42.0" + } + ], + "section": { + "title": "Physics", + "rows": [ + { + "archetype": "box-stack", + "category": "Physics", + "count": 3000, + "loadId": "3k", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 2.6800000000000637, + "referenceP95Ms": 2.8799999999998818, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.620000000002619, + "competitorP95Ms": 6.460000000006403, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.4768683274019243, + "factor": 2.097014925374062, + "label": "ExoJS leads (2.10x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 6802); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.660000000000082, + "maxMs": 2.7799999999999727, + "ratio": 1.0451127819548447 + }, + "competitor": { + "minMs": 5.580000000001746, + "maxMs": 5.639999999999418, + "ratio": 1.0107526881716224 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 2.6800000000000637, + "referenceP95Ms": 2.8799999999998818, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 3.9100000000034925, + "competitorP95Ms": 4.78000000002794, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6854219948843145, + "factor": 1.4589552238818655, + "label": "ExoJS leads (1.46x)", + "structural": false + }, + "mechanism": "identical scene (3001 bodies, 3000 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.660000000000082, + "maxMs": 2.7799999999999727, + "ratio": 1.0451127819548447 + }, + "competitor": { + "minMs": 3.820000000006985, + "maxMs": 4, + "ratio": 1.0471204188462528 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 2.6800000000000637, + "referenceP95Ms": 2.8799999999998818, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 15.139999999999418, + "competitorP95Ms": 18.75999999998021, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.17701453104360415, + "factor": 5.649253731342932, + "label": "ExoJS leads clearly (5.65x)", + "structural": true + }, + "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 6116); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.660000000000082, + "maxMs": 2.7799999999999727, + "ratio": 1.0451127819548447 + }, + "competitor": { + "minMs": 15.119999999995343, + "maxMs": 15.169999999998254, + "ratio": 1.0033068783070718 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 2.6800000000000637, + "referenceP95Ms": 2.8799999999998818, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.85999999998603, + "competitorP95Ms": 3, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9370629370675365, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 5757); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.660000000000082, + "maxMs": 2.7799999999999727, + "ratio": 1.0451127819548447 + }, + "competitor": { + "minMs": 2.85999999998603, + "maxMs": 2.8999999999650754, + "ratio": 1.0139860139787555 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + } + ] + }, + { + "archetype": "box-stack", + "category": "Physics", + "count": 5500, + "loadId": "5500", + "unit": "bodies", + "primary": true, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 5.559999999999945, + "referenceP95Ms": 5.820000000000164, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 11.270000000004075, + "competitorP95Ms": 12.279999999998836, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.49334516415243435, + "factor": 2.02697841726694, + "label": "ExoJS leads (2.03x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 12297); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.2599999999997635, + "maxMs": 5.619999999999891, + "ratio": 1.0684410646388105 + }, + "competitor": { + "minMs": 10.389999999999418, + "maxMs": 11.299999999995634, + "ratio": 1.087584215591556 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 5.559999999999945, + "referenceP95Ms": 5.820000000000164, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 10.739999999990687, + "competitorP95Ms": 13.440000000002328, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5176908752332186, + "factor": 1.9316546762573366, + "label": "ExoJS leads (1.93x)", + "structural": false + }, + "mechanism": "identical scene (5501 bodies, 5501 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.2599999999997635, + "maxMs": 5.619999999999891, + "ratio": 1.0684410646388105 + }, + "competitor": { + "minMs": 10.350000000034925, + "maxMs": 10.989999999990687, + "ratio": 1.0618357487877876 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 5.559999999999945, + "referenceP95Ms": 5.820000000000164, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 28.679999999993015, + "competitorP95Ms": 35.139999999984866, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.19386331938637724, + "factor": 5.158273381293759, + "label": "ExoJS leads clearly (5.16x)", + "structural": true + }, + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10677); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.2599999999997635, + "maxMs": 5.619999999999891, + "ratio": 1.0684410646388105 + }, + "competitor": { + "minMs": 28.40999999998894, + "maxMs": 28.930000000007567, + "ratio": 1.0183034142914054 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 5.559999999999945, + "referenceP95Ms": 5.820000000000164, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 4.10999999998603, + "competitorP95Ms": 5.64000000001397, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.3527980535325654, + "factor": 1.3527980535325654, + "label": "competitor leads (1.35x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10045); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.2599999999997635, + "maxMs": 5.619999999999891, + "ratio": 1.0684410646388105 + }, + "competitor": { + "minMs": 4.0899999999965075, + "maxMs": 4.369999999995343, + "ratio": 1.0684596577014853 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "box-stack", + "category": "Physics", + "count": 10000, + "loadId": "10k", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 10.360000000000582, + "referenceP95Ms": 11.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 22.860000000000582, + "competitorP95Ms": 26.360000000000582, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.45319335083116, + "factor": 2.2065637065636388, + "label": "ExoJS leads (2.21x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 22396); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.319999999999709, + "maxMs": 10.390000000000327, + "ratio": 1.0067829457364943 + }, + "competitor": { + "minMs": 22.400000000001455, + "maxMs": 23.019999999989523, + "ratio": 1.027678571428037 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 10.360000000000582, + "referenceP95Ms": 11.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 26.519999999989523, + "competitorP95Ms": 35.63999999995576, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.39064856711933166, + "factor": 2.5598455598444048, + "label": "ExoJS leads (2.56x)", + "structural": false + }, + "mechanism": "identical scene (10001 bodies, 10002 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.319999999999709, + "maxMs": 10.390000000000327, + "ratio": 1.0067829457364943 + }, + "competitor": { + "minMs": 26.419999999983702, + "maxMs": 26.699999999953434, + "ratio": 1.0105980317929564 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 10.360000000000582, + "referenceP95Ms": 11.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 69.68000000000757, + "competitorP95Ms": 88.55999999999767, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.148679678530417, + "factor": 6.725868725869079, + "label": "ExoJS leads clearly (6.73x)", + "structural": true + }, + "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 19865); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.319999999999709, + "maxMs": 10.390000000000327, + "ratio": 1.0067829457364943 + }, + "competitor": { + "minMs": 69.59999999999127, + "maxMs": 70.02999999999884, + "ratio": 1.0061781609196496 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 10.360000000000582, + "referenceP95Ms": 11.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 7.0899999999965075, + "competitorP95Ms": 10.039999999979045, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.461212976023369, + "factor": 1.461212976023369, + "label": "competitor leads (1.46x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 17880); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 10.319999999999709, + "maxMs": 10.390000000000327, + "ratio": 1.0067829457364943 + }, + "competitor": { + "minMs": 7.070000000006985, + "maxMs": 7.529999999998836, + "ratio": 1.065063649220848 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "many-dynamic", + "category": "Physics", + "count": 800, + "loadId": "800", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 2.8000000000010914, + "referenceP95Ms": 3.0200000000004366, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.6000000000058208, + "competitorP95Ms": 2.960000000006403, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0769230769210858, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.780000000000655, + "maxMs": 2.819999999999709, + "ratio": 1.0143884892082895 + }, + "competitor": { + "minMs": 2.5599999999976717, + "maxMs": 2.6999999999970896, + "ratio": 1.0546874999998224 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 2.8000000000010914, + "referenceP95Ms": 3.0200000000004366, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.4799999999813735, + "competitorP95Ms": 6.440000000002328, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.129032258073436, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.780000000000655, + "maxMs": 2.819999999999709, + "ratio": 1.0143884892082895 + }, + "competitor": { + "minMs": 2.3800000000046566, + "maxMs": 2.480000000039581, + "ratio": 1.042016806737281 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 2.8000000000010914, + "referenceP95Ms": 3.0200000000004366, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.7399999999906868, + "competitorP95Ms": 2.9799999999813735, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0218978102228498, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.780000000000655, + "maxMs": 2.819999999999709, + "ratio": 1.0143884892082895 + }, + "competitor": { + "minMs": 2.7000000000116415, + "maxMs": 2.75, + "ratio": 1.018518518514127 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 2.8000000000010914, + "referenceP95Ms": 3.0200000000004366, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.6199999999953434, + "competitorP95Ms": 0.6799999999930151, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 4.516129032293744, + "factor": 4.516129032293744, + "label": "competitor leads (4.52x)", + "structural": false + }, + "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.780000000000655, + "maxMs": 2.819999999999709, + "ratio": 1.0143884892082895 + }, + "competitor": { + "minMs": 0.6199999999953434, + "maxMs": 0.6400000000139698, + "ratio": 1.032258064546414 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] + }, + { + "archetype": "many-dynamic", + "category": "Physics", + "count": 1500, + "loadId": "1500", + "unit": "bodies", + "primary": true, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.600000000000364, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.239999999990687, + "competitorP95Ms": 6.059999999997672, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.061068702291865, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.540000000000873, + "maxMs": 5.56000000000131, + "ratio": 1.0036101083033273 + }, + "competitor": { + "minMs": 5.220000000001164, + "maxMs": 5.290000000000873, + "ratio": 1.013409961685765 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.600000000000364, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.4799999999813735, + "competitorP95Ms": 6.440000000002328, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0145985401493411, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.540000000000873, + "maxMs": 5.56000000000131, + "ratio": 1.0036101083033273 + }, + "competitor": { + "minMs": 5.460000000020955, + "maxMs": 5.480000000039581, + "ratio": 1.003663003666401 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.600000000000364, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.64000000001397, + "competitorP95Ms": 6.580000000016298, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9858156028343473, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.540000000000873, + "maxMs": 5.56000000000131, + "ratio": 1.0036101083033273 + }, + "competitor": { + "minMs": 5.64000000001397, + "maxMs": 5.6600000000034925, + "ratio": 1.0035460992889136 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.600000000000364, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.2999999999883585, + "competitorP95Ms": 1.3400000000256114, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 4.276923076960985, + "factor": 4.276923076960985, + "label": "competitor leads (4.28x)", + "structural": false + }, + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.540000000000873, + "maxMs": 5.56000000000131, + "ratio": 1.0036101083033273 + }, + "competitor": { + "minMs": 1.2999999999883585, + "maxMs": 1.3599999999860302, + "ratio": 1.0461538461524684 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" + { + "archetype": "many-dynamic", + "category": "Physics", + "count": 2200, + "loadId": "2200", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 8.760000000000218, + "referenceP95Ms": 11.539999999999054, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 8.059999999997672, + "competitorP95Ms": 9.639999999999418, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0868486352360731, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 8.740000000000691, + "maxMs": 8.780000000000655, + "ratio": 1.0045766590388971 + }, + "competitor": { + "minMs": 8.040000000008149, + "maxMs": 8.059999999997672, + "ratio": 1.0024875621877491 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 8.760000000000218, + "referenceP95Ms": 11.539999999999054, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 8.940000000002328, + "competitorP95Ms": 10.979999999981374, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9798657718118498, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 8.740000000000691, + "maxMs": 8.780000000000655, + "ratio": 1.0045766590388971 + }, + "competitor": { + "minMs": 8.819999999977881, + "maxMs": 9.119999999995343, + "ratio": 1.034013605444242 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 8.760000000000218, + "referenceP95Ms": 11.539999999999054, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 9.379999999990105, + "competitorP95Ms": 13.720000000001164, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9339019189775544, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 8.740000000000691, + "maxMs": 8.780000000000655, + "ratio": 1.0045766590388971 + }, + "competitor": { + "minMs": 9.339999999996508, + "maxMs": 9.400000000023283, + "ratio": 1.006423982872248 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 8.760000000000218, + "referenceP95Ms": 11.539999999999054, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.9600000000209548, + "competitorP95Ms": 2.0399999999790452, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 4.4693877550543695, + "factor": 4.4693877550543695, + "label": "competitor leads (4.47x)", + "structural": false + }, + "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 8.740000000000691, + "maxMs": 8.780000000000655, + "ratio": 1.0045766590388971 + }, + "competitor": { + "minMs": 1.8999999999650754, + "maxMs": 1.9799999999813735, + "ratio": 1.0421052631672467 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.019999999999999574, - "crossOriginIsolated": true + { + "archetype": "mixed-static-dynamic", + "category": "Physics", + "count": 900, + "loadId": "900", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 2.139999999999418, + "referenceP95Ms": 2.2400000000016007, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.8399999999965075, + "competitorP95Ms": 1.0399999999935972, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.547619047628947, + "factor": 2.547619047628947, + "label": "competitor leads (2.55x)", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.1199999999989814, + "maxMs": 2.139999999999418, + "ratio": 1.0094339622643613 + }, + "competitor": { + "minMs": 0.8399999999965075, + "maxMs": 0.8800000000046566, + "ratio": 1.0476190476289469 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 2.139999999999418, + "referenceP95Ms": 2.2400000000016007, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.9400000000023283, + "competitorP95Ms": 6.599999999976717, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.1030927835035307, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor resolves fewer solved contacts (1153 vs 704); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.1199999999989814, + "maxMs": 2.139999999999418, + "ratio": 1.0094339622643613 + }, + "competitor": { + "minMs": 1.8800000000046566, + "maxMs": 1.9600000000209548, + "ratio": 1.0425531914979256 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 2.139999999999418, + "referenceP95Ms": 2.2400000000016007, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.8399999999965075, + "competitorP95Ms": 3.8399999999965075, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.753521126761285, + "factor": 1.3271028037370467, + "label": "ExoJS leads (1.33x)", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.1199999999989814, + "maxMs": 2.139999999999418, + "ratio": 1.0094339622643613 + }, + "competitor": { + "minMs": 2.820000000006985, + "maxMs": 2.860000000015134, + "ratio": 1.0141843971659752 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 2.139999999999418, + "referenceP95Ms": 2.2400000000016007, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.6400000000139698, + "competitorP95Ms": 0.7599999999511056, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 3.3437499999261036, + "factor": 3.3437499999261036, + "label": "competitor leads (3.34x)", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.1199999999989814, + "maxMs": 2.139999999999418, + "ratio": 1.0094339622643613 + }, + "competitor": { + "minMs": 0.6199999999953434, + "maxMs": 0.6599999999743886, + "ratio": 1.0645161289989447 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:20:58.243Z" - }, - { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" + { + "archetype": "mixed-static-dynamic", + "category": "Physics", + "count": 1700, + "loadId": "1700", + "unit": "bodies", + "primary": true, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 4.6599999999998545, + "referenceP95Ms": 5.040000000000873, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.139999999999418, + "competitorP95Ms": 2.6199999999953434, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.1775700934584683, + "factor": 2.1775700934584683, + "label": "competitor leads (2.18x)", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.599999999998545, + "maxMs": 4.690000000000509, + "ratio": 1.0195652173917376 + }, + "competitor": { + "minMs": 2.110000000000582, + "maxMs": 2.3400000000110595, + "ratio": 1.1090047393414284 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 4.6599999999998545, + "referenceP95Ms": 5.040000000000873, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 4.580000000016298, + "competitorP95Ms": 5.5799999999580905, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 1.0174672489046446, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.599999999998545, + "maxMs": 4.690000000000509, + "ratio": 1.0195652173917376 + }, + "competitor": { + "minMs": 4.400000000023283, + "maxMs": 4.769999999989523, + "ratio": 1.0840909090827913 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 4.6599999999998545, + "referenceP95Ms": 5.040000000000873, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 7.960000000006403, + "competitorP95Ms": 10.39999999999418, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5854271356779027, + "factor": 1.7081545064391956, + "label": "ExoJS leads (1.71x)", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.599999999998545, + "maxMs": 4.690000000000509, + "ratio": 1.0195652173917376 + }, + "competitor": { + "minMs": 7.899999999994179, + "maxMs": 8.059999999997672, + "ratio": 1.020253164557419 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 4.6599999999998545, + "referenceP95Ms": 5.040000000000873, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.5800000000162981, + "competitorP95Ms": 1.779999999969732, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.949367088577079, + "factor": 2.949367088577079, + "label": "competitor leads (2.95x)", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 4.599999999998545, + "maxMs": 4.690000000000509, + "ratio": 1.0195652173917376 + }, + "competitor": { + "minMs": 1.5799999999580905, + "maxMs": 1.6400000000139698, + "ratio": 1.0379746835806778 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" + { + "archetype": "mixed-static-dynamic", + "category": "Physics", + "count": 3200, + "loadId": "3200", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 9.2599999999984, + "referenceP95Ms": 10.899999999997817, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.80000000000291, + "competitorP95Ms": 6.960000000006403, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.5965517241368539, + "factor": 1.5965517241368539, + "label": "competitor leads (1.60x)", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 9.05999999999949, + "maxMs": 9.44000000000051, + "ratio": 1.041942604856627 + }, + "competitor": { + "minMs": 5.720000000001164, + "maxMs": 5.849999999998545, + "ratio": 1.0227272727268102 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 9.2599999999984, + "referenceP95Ms": 10.899999999997817, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 11.239999999990687, + "competitorP95Ms": 13.5, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.823843416370647, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 9.05999999999949, + "maxMs": 9.44000000000051, + "ratio": 1.041942604856627 + }, + "competitor": { + "minMs": 11.220000000001164, + "maxMs": 11.39000000001397, + "ratio": 1.015151515152655 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 9.2599999999984, + "referenceP95Ms": 10.899999999997817, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 20.24000000000524, + "competitorP95Ms": 31.599999999976717, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.4575098814227274, + "factor": 2.1857451403897126, + "label": "ExoJS leads (2.19x)", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 9.05999999999949, + "maxMs": 9.44000000000051, + "ratio": 1.041942604856627 + }, + "competitor": { + "minMs": 20.069999999992433, + "maxMs": 20.64000000001397, + "ratio": 1.028400597908408 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 9.2599999999984, + "referenceP95Ms": 10.899999999997817, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 3.639999999984866, + "competitorP95Ms": 4.2999999999883585, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.543956043966181, + "factor": 2.543956043966181, + "label": "competitor leads (2.54x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (3670 vs 6105); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 9.05999999999949, + "maxMs": 9.44000000000051, + "ratio": 1.041942604856627 + }, + "competitor": { + "minMs": 3.6300000000046566, + "maxMs": 3.8399999999965075, + "ratio": 1.0578512396671023 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.019999999999999574, - "crossOriginIsolated": true + { + "archetype": "raycast", + "category": "Physics", + "count": 900, + "loadId": "900", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 2.8400000000001455, + "referenceP95Ms": 3.0600000000013097, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 3, + "competitorP95Ms": 4.119999999995343, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9466666666667152, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 63 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.7999999999992724, + "maxMs": 2.860000000000582, + "ratio": 1.0214285714290448 + }, + "competitor": { + "minMs": 2.9799999999959255, + "maxMs": 3.02999999999156, + "ratio": 1.016778523488491 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 2.8400000000001455, + "referenceP95Ms": 3.0600000000013097, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 5.739999999990687, + "competitorP95Ms": 6.720000000030268, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.49477351916459117, + "factor": 2.0211267605599974, + "label": "ExoJS leads (2.02x)", + "structural": false + }, + "mechanism": "competitor resolves fewer solved contacts (1153 vs 704); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.7999999999992724, + "maxMs": 2.860000000000582, + "ratio": 1.0214285714290448 + }, + "competitor": { + "minMs": 5.559999999997672, + "maxMs": 5.940000000002328, + "ratio": 1.0683453237418734 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 2.8400000000001455, + "referenceP95Ms": 3.0600000000013097, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.959999999991851, + "competitorP95Ms": 3.919999999983702, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.95945945946215, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 63 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.7999999999992724, + "maxMs": 2.860000000000582, + "ratio": 1.0214285714290448 + }, + "competitor": { + "minMs": 2.959999999991851, + "maxMs": 2.9800000000104774, + "ratio": 1.006756756763068 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 2.8400000000001455, + "referenceP95Ms": 3.0600000000013097, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.6799999999930151, + "competitorP95Ms": 0.8599999999860302, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 4.176470588278408, + "factor": 4.176470588278408, + "label": "competitor leads (4.18x)", + "structural": false + }, + "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 64 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 2.7999999999992724, + "maxMs": 2.860000000000582, + "ratio": 1.0214285714290448 + }, + "competitor": { + "minMs": 0.6799999999930151, + "maxMs": 0.7000000000116415, + "ratio": 1.0294117647335763 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:32:46.548Z" - }, - { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" + { + "archetype": "raycast", + "category": "Physics", + "count": 1700, + "loadId": "1700", + "unit": "bodies", + "primary": true, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 5.920000000000073, + "referenceP95Ms": 6.479999999999563, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 6.549999999995634, + "competitorP95Ms": 8.220000000001164, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": 0.9038167938937433, + "factor": 1, + "label": "level", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 44 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.829999999998108, + "maxMs": 5.950000000000728, + "ratio": 1.0205831903949671 + }, + "competitor": { + "minMs": 6.549999999995634, + "maxMs": 6.639999999999418, + "ratio": 1.013740458015854 + }, + "stable": true, + "rungs": [ + "level", + "level", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 5.920000000000073, + "referenceP95Ms": 6.479999999999563, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 12.950000000011642, + "competitorP95Ms": 14.64000000001397, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.4571428571424518, + "factor": 2.18750000000194, + "label": "ExoJS leads (2.19x)", + "structural": false + }, + "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.829999999998108, + "maxMs": 5.950000000000728, + "ratio": 1.0205831903949671 + }, + "competitor": { + "minMs": 12.209999999991851, + "maxMs": 13.259999999951106, + "ratio": 1.0859950859918064 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 5.920000000000073, + "referenceP95Ms": 6.479999999999563, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 8.330000000001746, + "competitorP95Ms": 10.800000000017462, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.7106842737093435, + "factor": 1.4070945945948723, + "label": "ExoJS leads (1.41x)", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 37 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.829999999998108, + "maxMs": 5.950000000000728, + "ratio": 1.0205831903949671 + }, + "competitor": { + "minMs": 8.19999999999709, + "maxMs": 8.370000000009895, + "ratio": 1.0207317073186422 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 5.920000000000073, + "referenceP95Ms": 6.479999999999563, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.7000000000116415, + "competitorP95Ms": 1.900000000023283, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 3.4823529411526666, + "factor": 3.4823529411526666, + "label": "competitor leads (3.48x)", + "structural": false + }, + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 39 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 5.829999999998108, + "maxMs": 5.950000000000728, + "ratio": 1.0205831903949671 + }, + "competitor": { + "minMs": 1.7000000000116415, + "maxMs": 1.7199999999720603, + "ratio": 1.0117647058589894 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" + { + "archetype": "raycast", + "category": "Physics", + "count": 3200, + "loadId": "3200", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 11.239999999999782, + "referenceP95Ms": 12.7599999999984, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 13.789999999993597, + "competitorP95Ms": 17.360000000000582, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 49 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.100000000002183, + "maxMs": 11.409999999999854, + "ratio": 1.0279279279277127 + }, + "competitor": { + "minMs": 13.779999999998836, + "maxMs": 13.940000000002328, + "ratio": 1.0116110304792094 + }, + "stable": false, + "rungs": [ + "level", + "exojs-leads", + "level" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 11.239999999999782, + "referenceP95Ms": 12.7599999999984, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 27.85000000000582, + "competitorP95Ms": 45.339999999967404, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.40359066427279827, + "factor": 2.4777580071180036, + "label": "ExoJS leads (2.48x)", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 41 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.100000000002183, + "maxMs": 11.409999999999854, + "ratio": 1.0279279279277127 + }, + "competitor": { + "minMs": 27.380000000004657, + "maxMs": 28.279999999969732, + "ratio": 1.032870708545103 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 11.239999999999782, + "referenceP95Ms": 12.7599999999984, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 20.679999999993015, + "competitorP95Ms": 31.89999999999418, + "competitorGpuMs": null, + "competitorOverFrameBudget": true, + "verdict": { + "side": "exojs", + "ratio": 0.5435203094779293, + "factor": 1.839857651244966, + "label": "ExoJS leads (1.84x)", + "structural": false + }, + "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 37 ray hits per step; the difference is query and solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.100000000002183, + "maxMs": 11.409999999999854, + "ratio": 1.0279279279277127 + }, + "competitor": { + "minMs": 20.39999999999418, + "maxMs": 21.0400000000227, + "ratio": 1.0313725490210148 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 11.239999999999782, + "referenceP95Ms": 12.7599999999984, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 3.7999999999883585, + "competitorP95Ms": 4.14000000001397, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 2.9578947368511095, + "factor": 2.9578947368511095, + "label": "competitor leads (2.96x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (3670 vs 6105); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.100000000002183, + "maxMs": 11.409999999999854, + "ratio": 1.0279279279277127 + }, + "competitor": { + "minMs": 3.7999999999883585, + "maxMs": 3.8500000000058208, + "ratio": 1.0131578947414777 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + } + ] }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.019999999999999574, - "crossOriginIsolated": true + { + "archetype": "body-churn", + "category": "Physics", + "count": 800, + "loadId": "800", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 1.5800000000017462, + "referenceP95Ms": 1.7800000000061118, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.8999999999941792, + "competitorP95Ms": 3.1199999999953434, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.5448275862085923, + "factor": 1.8354430379689708, + "label": "ExoJS leads (1.84x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (760 vs 2056); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.5600000000049477, + "maxMs": 1.5800000000017462, + "ratio": 1.01282051281842 + }, + "competitor": { + "minMs": 2.820000000006985, + "maxMs": 2.9400000000023283, + "ratio": 1.042553191487605 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 1.5800000000017462, + "referenceP95Ms": 1.7800000000061118, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.0799999999580905, + "competitorP95Ms": 1.2399999999906868, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 1.4629629630213503, + "factor": 1.4629629630213503, + "label": "competitor leads (1.46x)", + "structural": false + }, + "mechanism": "competitor resolves fewer solved contacts (760 vs 359); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.5600000000049477, + "maxMs": 1.5800000000017462, + "ratio": 1.01282051281842 + }, + "competitor": { + "minMs": 1.0200000000186265, + "maxMs": 1.1000000000349246, + "ratio": 1.078431372563566 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 1.5800000000017462, + "referenceP95Ms": 1.7800000000061118, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 2.620000000024447, + "competitorP95Ms": 3.1000000000058208, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.6030534351095432, + "factor": 1.658227848114906, + "label": "ExoJS leads (1.66x)", + "structural": false + }, + "mechanism": "ExoJS resolves fewer solved contacts (760 vs 1782); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.5600000000049477, + "maxMs": 1.5800000000017462, + "ratio": 1.01282051281842 + }, + "competitor": { + "minMs": 2.6199999999953434, + "maxMs": 2.64000000001397, + "ratio": 1.0076335877933824 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 1.5800000000017462, + "referenceP95Ms": 1.7800000000061118, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.3099999999976717, + "competitorP95Ms": 0.3800000000046566, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 5.0967741935923, + "factor": 5.0967741935923, + "label": "competitor leads clearly (5.10x)", + "structural": true + }, + "mechanism": "identical scene (804 bodies, 760 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.5600000000049477, + "maxMs": 1.5800000000017462, + "ratio": 1.01282051281842 + }, + "competitor": { + "minMs": 0.3099999999976717, + "maxMs": 0.3099999999976717, + "ratio": 1 + }, + "stable": true, + "rungs": [ + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" + ] + } + } + ] }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T04:44:36.717Z" - } - ], - "libraries": [ - { - "name": "@codexo/exojs-physics", - "version": "0.17.0" - }, - { - "name": "matter-js", - "version": "0.20.0" - }, - { - "name": "planck", - "version": "1.5.0" - }, - { - "name": "@dimforge/rapier2d-compat", - "version": "0.19.3" - }, - { - "name": "@newkrok/nape-js", - "version": "3.42.0" - } - ], - "section": { - "title": "Physics", - "rows": [ { - "archetype": "box-stack", + "archetype": "body-churn", "category": "Physics", - "count": 5500, - "loadId": "5500", + "count": 1500, + "loadId": "1500", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 5.350000000000136, - "referenceP95Ms": 6.120000000000118, + "referenceMs": 5.799999999999272, + "referenceP95Ms": 7.379999999997381, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 10.290000000000873, - "competitorP95Ms": 12.119999999998981, + "competitorMs": 5.740000000005239, + "competitorP95Ms": 6.8399999999965075, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.5199222546161013, - "factor": 1.9233644859814225, - "label": "ExoJS leads (1.92x)", + "side": "neither", + "ratio": 1.0104529616714248, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 12297); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3762); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.3400000000001455, - "maxMs": 5.460000000000036, - "ratio": 1.0224719101123385 + "minMs": 5.799999999995634, + "maxMs": 5.829999999998108, + "ratio": 1.0051724137935338 }, "competitor": { - "minMs": 10.180000000000291, - "maxMs": 11.140000000001237, - "ratio": 1.094302554027595 + "minMs": 5.639999999999418, + "maxMs": 5.790000000000873, + "ratio": 1.0265957446811118 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } }, { "competitor": "nape-js", - "referenceMs": 5.350000000000136, - "referenceP95Ms": 6.120000000000118, + "referenceMs": 5.799999999999272, + "referenceP95Ms": 7.379999999997381, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 10.080000000001746, - "competitorP95Ms": 12.15999999998894, + "competitorMs": 3.4400000000023283, + "competitorP95Ms": 4, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.5307539682538899, - "factor": 1.8841121495329884, - "label": "ExoJS leads (1.88x)", + "side": "competitor", + "ratio": 1.6860465116265544, + "factor": 1.6860465116265544, + "label": "competitor leads (1.69x)", "structural": false }, - "mechanism": "identical scene (5501 bodies, 5501 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.3400000000001455, - "maxMs": 5.460000000000036, - "ratio": 1.0224719101123385 + "minMs": 5.799999999995634, + "maxMs": 5.829999999998108, + "ratio": 1.0051724137935338 }, "competitor": { - "minMs": 10.009999999994761, - "maxMs": 10.220000000001164, - "ratio": 1.0209790209796716 + "minMs": 3.419999999983702, + "maxMs": 3.7999999999883585, + "ratio": 1.111111111113002 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "planck", - "referenceMs": 5.350000000000136, - "referenceP95Ms": 6.120000000000118, + "referenceMs": 5.799999999999272, + "referenceP95Ms": 7.379999999997381, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 29.81999999999971, - "competitorP95Ms": 36.4800000000032, + "competitorMs": 5.199999999982538, + "competitorP95Ms": 6, "competitorGpuMs": null, - "competitorOverFrameBudget": true, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.17940979208585475, - "factor": 5.573831775700738, - "label": "ExoJS leads clearly (5.57x)", - "structural": true + "side": "neither", + "ratio": 1.115384615388221, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10677); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3163); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.3400000000001455, - "maxMs": 5.460000000000036, - "ratio": 1.0224719101123385 + "minMs": 5.799999999995634, + "maxMs": 5.829999999998108, + "ratio": 1.0051724137935338 }, "competitor": { - "minMs": 29.450000000000728, - "maxMs": 30.470000000004802, - "ratio": 1.0346349745332444 + "minMs": 5.080000000016298, + "maxMs": 5.269999999989523, + "ratio": 1.0374015747977587 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } }, { "competitor": "rapier", - "referenceMs": 5.350000000000136, - "referenceP95Ms": 6.120000000000118, + "referenceMs": 5.799999999999272, + "referenceP95Ms": 7.379999999997381, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 4.080000000001746, - "competitorP95Ms": 5.320000000006985, + "competitorMs": 0.7400000000488944, + "competitorP95Ms": 0.8000000000465661, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.3112745098033938, - "factor": 1.3112745098033938, - "label": "competitor leads (1.31x)", - "structural": false + "ratio": 7.837837837318981, + "factor": 7.837837837318981, + "label": "competitor leads clearly (7.84x)", + "structural": true }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10045); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.3400000000001455, - "maxMs": 5.460000000000036, - "ratio": 1.0224719101123385 + "minMs": 5.799999999995634, + "maxMs": 5.829999999998108, + "ratio": 1.0051724137935338 }, "competitor": { - "minMs": 4.059999999997672, - "maxMs": 4.0899999999965075, - "ratio": 1.0073891625612938 + "minMs": 0.7400000000488944, + "maxMs": 0.779999999969732, + "ratio": 1.0540540539435064 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "many-dynamic", + "archetype": "body-churn", "category": "Physics", - "count": 1500, - "loadId": "1500", + "count": 2400, + "loadId": "2400", "unit": "bodies", - "primary": true, + "primary": false, "cells": [ { "competitor": "matter-js", - "referenceMs": 5.460000000000036, - "referenceP95Ms": 6.5, + "referenceMs": 11.819999999999709, + "referenceP95Ms": 14.220000000001164, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.240000000001601, - "competitorP95Ms": 6.219999999997526, + "competitorMs": 9.880000000004657, + "competitorP95Ms": 12.059999999997672, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.041984732824116, + "ratio": 1.1963562753030503, "factor": 1, "label": "level", "structural": false }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "ExoJS resolves fewer solved contacts (2282 vs 6230); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.4399999999996, - "maxMs": 5.559999999999945, - "ratio": 1.022058823529477 + "minMs": 11.68999999999869, + "maxMs": 11.819999999999709, + "ratio": 1.0111206159111235 }, "competitor": { - "minMs": 5.240000000001601, - "maxMs": 5.400000000001455, - "ratio": 1.0305343511450011 + "minMs": 9.860000000000582, + "maxMs": 9.940000000002328, + "ratio": 1.0081135902638683 }, "stable": true, "rungs": [ @@ -5595,77 +14403,77 @@ }, { "competitor": "nape-js", - "referenceMs": 5.460000000000036, - "referenceP95Ms": 6.5, + "referenceMs": 11.819999999999709, + "referenceP95Ms": 14.220000000001164, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.8399999999965075, - "competitorP95Ms": 6.69999999999709, + "competitorMs": 5.599999999976717, + "competitorP95Ms": 12.279999999969732, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9349315068498804, - "factor": 1, - "label": "level", + "side": "competitor", + "ratio": 2.1107142857230095, + "factor": 2.1107142857230095, + "label": "competitor leads (2.11x)", "structural": false }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (2404 bodies, 2282 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.4399999999996, - "maxMs": 5.559999999999945, - "ratio": 1.022058823529477 + "minMs": 11.68999999999869, + "maxMs": 11.819999999999709, + "ratio": 1.0111206159111235 }, "competitor": { - "minMs": 5.819999999992433, - "maxMs": 5.899999999994179, - "ratio": 1.0137457044676719 + "minMs": 5.540000000008149, + "maxMs": 5.860000000015134, + "ratio": 1.0577617328531614 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "planck", - "referenceMs": 5.460000000000036, - "referenceP95Ms": 6.5, + "referenceMs": 11.819999999999709, + "referenceP95Ms": 14.220000000001164, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.819999999999709, - "competitorP95Ms": 6.619999999995343, + "competitorMs": 9.800000000017462, + "competitorP95Ms": 11.760000000009313, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.9381443298969604, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "ExoJS resolves fewer solved contacts (2282 vs 5242); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.4399999999996, - "maxMs": 5.559999999999945, - "ratio": 1.022058823529477 + "minMs": 11.68999999999869, + "maxMs": 11.819999999999709, + "ratio": 1.0111206159111235 }, "competitor": { - "minMs": 5.580000000001746, - "maxMs": 5.999999999996362, - "ratio": 1.0752688172033127 + "minMs": 9.759999999994761, + "maxMs": 9.880000000004657, + "ratio": 1.0122950819682335 }, - "stable": true, + "stable": false, "rungs": [ - "level", + "competitor-leads", "level", "level" ] @@ -5673,704 +14481,870 @@ }, { "competitor": "rapier", - "referenceMs": 5.460000000000036, - "referenceP95Ms": 6.5, + "referenceMs": 11.819999999999709, + "referenceP95Ms": 14.220000000001164, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.1600000000325963, + "competitorP95Ms": 1.2000000000116415, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 10.18965517212721, + "factor": 10.18965517212721, + "label": "competitor leads clearly (10.19x)", + "structural": true + }, + "mechanism": "identical scene (2404 bodies, 2282 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 11.68999999999869, + "maxMs": 11.819999999999709, + "ratio": 1.0111206159111235 + }, + "competitor": { + "minMs": 1.1599999999743886, + "maxMs": 1.179999999993015, + "ratio": 1.0172413793267827 + }, + "stable": true, + "rungs": [ + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" + ] + } + } + ] + }, + { + "archetype": "joints", + "category": "Physics", + "count": 4500, + "loadId": "4500", + "unit": "bodies", + "primary": false, + "cells": [ + { + "competitor": "matter-js", + "referenceMs": 0.6600000000034925, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 1.8999999999941792, + "competitorP95Ms": 2.539999999993597, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.3473684210555339, + "factor": 2.878787878763826, + "label": "ExoJS leads (2.88x)", + "structural": false + }, + "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.5200000000040745, + "maxMs": 0.6600000000034925, + "ratio": 1.2692307692275402 + }, + "competitor": { + "minMs": 1.860000000000582, + "maxMs": 1.9000000000087311, + "ratio": 1.0215053763484605 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, + { + "competitor": "nape-js", + "referenceMs": 0.6600000000034925, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0, + "competitorP95Ms": 0.002000000001862645, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "neither", + "ratio": null, + "factor": null, + "label": "not comparable", + "structural": false + }, + "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.5200000000040745, + "maxMs": 0.6600000000034925, + "ratio": 1.2692307692275402 + }, + "competitor": { + "minMs": 0, + "maxMs": 0, + "ratio": null + }, + "stable": true, + "rungs": [ + "not-comparable", + "not-comparable", + "not-comparable" + ] + } + }, + { + "competitor": "planck", + "referenceMs": 0.6600000000034925, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": null, + "referenceOverFrameBudget": false, + "competitorMs": 0.19333333332906477, + "competitorP95Ms": 0.20000000000194026, + "competitorGpuMs": null, + "competitorOverFrameBudget": false, + "verdict": { + "side": "competitor", + "ratio": 3.4137931035417126, + "factor": 3.4137931035417126, + "label": "competitor leads (3.41x)", + "structural": false + }, + "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.5200000000040745, + "maxMs": 0.6600000000034925, + "ratio": 1.2692307692275402 + }, + "competitor": { + "minMs": 0.18000000000271635, + "maxMs": 0.1933333333339154, + "ratio": 1.074074074061099 + }, + "stable": true, + "rungs": [ + "competitor-leads", + "competitor-leads", + "competitor-leads" + ] + } + }, + { + "competitor": "rapier", + "referenceMs": 0.6600000000034925, + "referenceP95Ms": 0.680000000000291, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 1.320000000006985, - "competitorP95Ms": 1.3800000000046566, + "competitorMs": 0.09999999997671694, + "competitorP95Ms": 0.11999999999534339, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 4.136363636341776, - "factor": 4.136363636341776, - "label": "competitor leads (4.14x)", - "structural": false + "ratio": 6.6000000015716065, + "factor": 6.6000000015716065, + "label": "competitor leads clearly (6.60x)", + "structural": true }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", + "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 5.4399999999996, - "maxMs": 5.559999999999945, - "ratio": 1.022058823529477 + "minMs": 0.5200000000040745, + "maxMs": 0.6600000000034925, + "ratio": 1.2692307692275402 }, "competitor": { - "minMs": 1.319999999999709, - "maxMs": 1.3399999999965075, - "ratio": 1.015151515149093 + "minMs": 0.09999999997671694, + "maxMs": 0.09999999997671694, + "ratio": 1 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "mixed-static-dynamic", + "archetype": "joints", "category": "Physics", - "count": 1700, - "loadId": "1700", + "count": 9000, + "loadId": "9k", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 4.539999999999964, - "referenceP95Ms": 4.839999999999236, + "referenceMs": 1.0400000000008731, + "referenceP95Ms": 1.0600000000049477, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 2.1199999999989814, - "competitorP95Ms": 2.319999999999709, + "competitorMs": 5.069999999999709, + "competitorP95Ms": 7.30000000000291, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 2.141509433963276, - "factor": 2.141509433963276, - "label": "competitor leads (2.14x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.520000000000437, - "maxMs": 4.579999999999927, - "ratio": 1.0132743362830718 + "minMs": 1.0400000000008731, + "maxMs": 1.0599999999976717, + "ratio": 1.0192307692276747 }, "competitor": { - "minMs": 2.1199999999989814, - "maxMs": 2.2400000000016007, - "ratio": 1.0566037735861684 + "minMs": 4.919999999998254, + "maxMs": 5.349999999998545, + "ratio": 1.08739837398383 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads-clearly", + "exojs-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 4.539999999999964, - "referenceP95Ms": 4.839999999999236, + "referenceMs": 1.0400000000008731, + "referenceP95Ms": 1.0600000000049477, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 4.899999999994179, - "competitorP95Ms": 6.039999999993597, + "competitorMs": 0, + "competitorP95Ms": 0.001999999996041879, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.9265306122459912, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "not comparable", "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 4.520000000000437, - "maxMs": 4.579999999999927, - "ratio": 1.0132743362830718 + "minMs": 1.0400000000008731, + "maxMs": 1.0599999999976717, + "ratio": 1.0192307692276747 }, "competitor": { - "minMs": 4.879999999997381, - "maxMs": 5.059999999997672, - "ratio": 1.0368852459017188 + "minMs": 0, + "maxMs": 0, + "ratio": null }, "stable": true, "rungs": [ - "level", - "level", - "level" + "not-comparable", + "not-comparable", + "not-comparable" ] } }, { "competitor": "planck", - "referenceMs": 4.539999999999964, - "referenceP95Ms": 4.839999999999236, + "referenceMs": 1.0400000000008731, + "referenceP95Ms": 1.0600000000049477, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 7.770000000000437, - "competitorP95Ms": 10.540000000000873, + "competitorMs": 0.3799999999901047, + "competitorP95Ms": 0.3800000000046566, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.5842985842985468, - "factor": 1.711453744493502, - "label": "ExoJS leads (1.71x)", + "side": "competitor", + "ratio": 2.7368421053367236, + "factor": 2.7368421053367236, + "label": "competitor leads (2.74x)", "structural": false }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.520000000000437, - "maxMs": 4.579999999999927, - "ratio": 1.0132743362830718 + "minMs": 1.0400000000008731, + "maxMs": 1.0599999999976717, + "ratio": 1.0192307692276747 }, "competitor": { - "minMs": 7.710000000002765, - "maxMs": 7.959999999999127, - "ratio": 1.0324254215299964 + "minMs": 0.3699999999953434, + "maxMs": 0.3800000000046566, + "ratio": 1.0270270270525381 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "rapier", - "referenceMs": 4.539999999999964, - "referenceP95Ms": 4.839999999999236, + "referenceMs": 1.0400000000008731, + "referenceP95Ms": 1.0600000000049477, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 1.639999999999418, - "competitorP95Ms": 1.8000000000029104, + "competitorMs": 0.20000000001164153, + "competitorP95Ms": 0.22000000003026798, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 2.7682926829277896, - "factor": 2.7682926829277896, - "label": "competitor leads (2.77x)", - "structural": false + "ratio": 5.199999999701686, + "factor": 5.199999999701686, + "label": "competitor leads clearly (5.20x)", + "structural": true }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 4.520000000000437, - "maxMs": 4.579999999999927, - "ratio": 1.0132743362830718 + "minMs": 1.0400000000008731, + "maxMs": 1.0599999999976717, + "ratio": 1.0192307692276747 }, "competitor": { - "minMs": 1.639999999999418, - "maxMs": 1.6600000000034925, - "ratio": 1.0121951219537084 + "minMs": 0.18000000005122274, + "maxMs": 0.20000000001164153, + "ratio": 1.1111111108595966 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "raycast", + "archetype": "joints", "category": "Physics", - "count": 1700, - "loadId": "1700", + "count": 15000, + "loadId": "15k", "unit": "bodies", - "primary": true, + "primary": false, "cells": [ { "competitor": "matter-js", - "referenceMs": 5.779999999998836, - "referenceP95Ms": 6.260000000000218, + "referenceMs": 2.040000000000873, + "referenceP95Ms": 2.0800000000017462, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 6.529999999998836, - "competitorP95Ms": 8.159999999999854, + "competitorMs": 9.5, + "competitorP95Ms": 11.339999999996508, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.8851454823889535, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.21473684210535507, + "factor": 4.656862745096046, + "label": "ExoJS leads (4.66x)", "structural": false }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 44 ray hits per step; the difference is query and solver cost", + "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.700000000000728, - "maxMs": 5.800000000000182, - "ratio": 1.017543859649025 + "minMs": 2.040000000000873, + "maxMs": 2.040000000000873, + "ratio": 1 }, "competitor": { - "minMs": 6.489999999999782, - "maxMs": 6.579999999999927, - "ratio": 1.0138674884437826 + "minMs": 9.369999999995343, + "maxMs": 9.529999999998836, + "ratio": 1.0170757737463791 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 5.779999999998836, - "referenceP95Ms": 6.260000000000218, + "referenceMs": 2.040000000000873, + "referenceP95Ms": 2.0800000000017462, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 12.680000000007567, - "competitorP95Ms": 14.280000000013388, + "competitorMs": 0, + "competitorP95Ms": 0.001999999996041879, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.4558359621447466, - "factor": 2.1937716262993288, - "label": "ExoJS leads (2.19x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "not comparable", "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", + "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 5.700000000000728, - "maxMs": 5.800000000000182, - "ratio": 1.017543859649025 + "minMs": 2.040000000000873, + "maxMs": 2.040000000000873, + "ratio": 1 }, "competitor": { - "minMs": 12.660000000003492, - "maxMs": 12.760000000009313, - "ratio": 1.007898894155276 + "minMs": 0, + "maxMs": 0, + "ratio": null }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "not-comparable", + "not-comparable", + "not-comparable" ] } }, { "competitor": "planck", - "referenceMs": 5.779999999998836, - "referenceP95Ms": 6.260000000000218, + "referenceMs": 2.040000000000873, + "referenceP95Ms": 2.0800000000017462, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 8.209999999999127, - "competitorP95Ms": 10.339999999996508, + "competitorMs": 0.6799999999930151, + "competitorP95Ms": 0.8199999999778811, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.7040194884286785, - "factor": 1.42041522491363, - "label": "ExoJS leads (1.42x)", + "side": "competitor", + "ratio": 3.0000000000320997, + "factor": 3.0000000000320997, + "label": "competitor leads (3.00x)", "structural": false }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 37 ray hits per step; the difference is query and solver cost", + "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.700000000000728, - "maxMs": 5.800000000000182, - "ratio": 1.017543859649025 + "minMs": 2.040000000000873, + "maxMs": 2.040000000000873, + "ratio": 1 }, "competitor": { - "minMs": 8.139999999999418, - "maxMs": 8.210000000002765, - "ratio": 1.0085995085999204 + "minMs": 0.639999999984866, + "maxMs": 0.7399999999906868, + "ratio": 1.1562500000127898 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "rapier", - "referenceMs": 5.779999999998836, - "referenceP95Ms": 6.260000000000218, + "referenceMs": 2.040000000000873, + "referenceP95Ms": 2.0800000000017462, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 1.7200000000011642, - "competitorP95Ms": 1.8399999999965075, + "competitorMs": 0.29999999998835847, + "competitorP95Ms": 0.3200000000069849, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 3.3604651162761185, - "factor": 3.3604651162761185, - "label": "competitor leads (3.36x)", - "structural": false + "ratio": 6.8000000002667855, + "factor": 6.8000000002667855, + "label": "competitor leads clearly (6.80x)", + "structural": true }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 39 ray hits per step; the difference is query and solver cost", + "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.700000000000728, - "maxMs": 5.800000000000182, - "ratio": 1.017543859649025 + "minMs": 2.040000000000873, + "maxMs": 2.040000000000873, + "ratio": 1 }, "competitor": { - "minMs": 1.6999999999970896, - "maxMs": 1.7200000000011642, - "ratio": 1.0117647058847699 + "minMs": 0.2800000000279397, + "maxMs": 0.29999999998835847, + "ratio": 1.0714285712800824 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "body-churn", + "archetype": "settling-pile", "category": "Physics", "count": 1500, "loadId": "1500", "unit": "bodies", - "primary": true, + "primary": false, "cells": [ { "competitor": "matter-js", - "referenceMs": 5.639999999999418, - "referenceP95Ms": 6.819999999999709, + "referenceMs": 1.680000000000291, + "referenceP95Ms": 1.7000000000043656, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.740000000005239, - "competitorP95Ms": 6.759999999994761, + "competitorMs": 4.820000000006985, + "competitorP95Ms": 5.5, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9825783972115454, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.34854771784187893, + "factor": 2.8690476190512797, + "label": "ExoJS leads (2.87x)", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3762); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.6200000000008, - "maxMs": 5.650000000000546, - "ratio": 1.005338078291769 + "minMs": 1.6599999999962165, + "maxMs": 1.7600000000020373, + "ratio": 1.0602409638590655 }, "competitor": { - "minMs": 5.680000000000291, - "maxMs": 5.880000000001019, - "ratio": 1.03521126760576 + "minMs": 4.820000000006985, + "maxMs": 5.360000000000582, + "ratio": 1.1120331950192561 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 5.639999999999418, - "referenceP95Ms": 6.819999999999709, + "referenceMs": 1.680000000000291, + "referenceP95Ms": 1.7000000000043656, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 3, - "competitorP95Ms": 3.7400000000052387, + "competitorMs": 4.179999999993015, + "competitorP95Ms": 4.900000000023283, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.879999999999806, - "factor": 1.879999999999806, - "label": "competitor leads (1.88x)", + "side": "exojs", + "ratio": 0.40191387559882735, + "factor": 2.4880952380906494, + "label": "ExoJS leads (2.49x)", "structural": false }, - "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.6200000000008, - "maxMs": 5.650000000000546, - "ratio": 1.005338078291769 + "minMs": 1.6599999999962165, + "maxMs": 1.7600000000020373, + "ratio": 1.0602409638590655 }, "competitor": { - "minMs": 2.860000000000582, - "maxMs": 3.460000000006403, - "ratio": 1.2097902097922024 + "minMs": 4.119999999995343, + "maxMs": 4.2000000000116415, + "ratio": 1.019417475732133 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "planck", - "referenceMs": 5.639999999999418, - "referenceP95Ms": 6.819999999999709, + "referenceMs": 1.680000000000291, + "referenceP95Ms": 1.7000000000043656, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.120000000009895, - "competitorP95Ms": 7.580000000001746, + "competitorMs": 5.690000000002328, + "competitorP95Ms": 7, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1.1015624999977573, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.2952548330403521, + "factor": 3.3869047619055612, + "label": "ExoJS leads (3.39x)", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3163); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.6200000000008, - "maxMs": 5.650000000000546, - "ratio": 1.005338078291769 + "minMs": 1.6599999999962165, + "maxMs": 1.7600000000020373, + "ratio": 1.0602409638590655 }, "competitor": { - "minMs": 5.07999999999447, - "maxMs": 5.180000000000291, - "ratio": 1.019685039371246 + "minMs": 5.6600000000034925, + "maxMs": 5.699999999982538, + "ratio": 1.0070671378054807 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "rapier", - "referenceMs": 5.639999999999418, - "referenceP95Ms": 6.819999999999709, + "referenceMs": 1.680000000000291, + "referenceP95Ms": 1.7000000000043656, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.7599999999947613, - "competitorP95Ms": 0.7799999999988358, + "competitorMs": 0.9199999999837019, + "competitorP95Ms": 0.9600000000209548, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 7.421052631629335, - "factor": 7.421052631629335, - "label": "competitor leads clearly (7.42x)", - "structural": true + "ratio": 1.8260869565544053, + "factor": 1.8260869565544053, + "label": "competitor leads (1.83x)", + "structural": false }, - "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.6200000000008, - "maxMs": 5.650000000000546, - "ratio": 1.005338078291769 + "minMs": 1.6599999999962165, + "maxMs": 1.7600000000020373, + "ratio": 1.0602409638590655 }, "competitor": { - "minMs": 0.7599999999947613, - "maxMs": 0.7599999999947613, - "ratio": 1 + "minMs": 0.9000000000232831, + "maxMs": 0.9199999999837019, + "ratio": 1.0222222221776682 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "joints", + "archetype": "settling-pile", "category": "Physics", - "count": 9000, - "loadId": "9k", + "count": 3000, + "loadId": "3k", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 4.959999999999127, - "referenceP95Ms": 5.3400000000001455, + "referenceMs": 3.720000000001164, + "referenceP95Ms": 4.440000000002328, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 4.860000000000582, - "competitorP95Ms": 7.519999999996799, + "competitorMs": 10.589999999996508, + "competitorP95Ms": 12.279999999998836, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1.0205761316869408, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.35127478753563657, + "factor": 2.8467741935465574, + "label": "ExoJS leads (2.85x)", "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (7875 vs 0); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.940000000000509, - "maxMs": 5.6200000000008, - "ratio": 1.137651821862393 + "minMs": 3.720000000001164, + "maxMs": 3.7399999999979627, + "ratio": 1.0053763440851593 }, "competitor": { - "minMs": 4.779999999998836, - "maxMs": 6.25, - "ratio": 1.3075313807534565 + "minMs": 10.579999999987194, + "maxMs": 10.60000000000582, + "ratio": 1.0018903591700048 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 4.959999999999127, - "referenceP95Ms": 5.3400000000001455, + "referenceMs": 3.720000000001164, + "referenceP95Ms": 4.440000000002328, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0, - "competitorP95Ms": 0.0020000000004074536, + "competitorMs": 11.459999999962747, + "competitorP95Ms": 15.279999999969732, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "not comparable", + "side": "exojs", + "ratio": 0.32460732984408874, + "factor": 3.080645161279344, + "label": "ExoJS leads (3.08x)", "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (7875 vs 0); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "limited", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.940000000000509, - "maxMs": 5.6200000000008, - "ratio": 1.137651821862393 + "minMs": 3.720000000001164, + "maxMs": 3.7399999999979627, + "ratio": 1.0053763440851593 }, "competitor": { - "minMs": 0, - "maxMs": 0, - "ratio": null + "minMs": 11.239999999990687, + "maxMs": 11.5, + "ratio": 1.0231316725987125 }, "stable": true, "rungs": [ - "not-comparable", - "not-comparable", - "not-comparable" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "planck", - "referenceMs": 4.959999999999127, - "referenceP95Ms": 5.3400000000001455, + "referenceMs": 3.720000000001164, + "referenceP95Ms": 4.440000000002328, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.37000000000261934, - "competitorP95Ms": 0.4599999999991269, + "competitorMs": 13.880000000004657, + "competitorP95Ms": 21.380000000004657, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 13.405405405308144, - "factor": 13.405405405308144, - "label": "competitor leads clearly (13.41x)", - "structural": true + "side": "exojs", + "ratio": 0.26801152737751555, + "factor": 3.7311827956990093, + "label": "ExoJS leads (3.73x)", + "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (7875 vs 0); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.940000000000509, - "maxMs": 5.6200000000008, - "ratio": 1.137651821862393 + "minMs": 3.720000000001164, + "maxMs": 3.7399999999979627, + "ratio": 1.0053763440851593 }, "competitor": { - "minMs": 0.3699999999953434, - "maxMs": 0.3799999999901047, - "ratio": 1.0270270270132085 + "minMs": 13.749999999985448, + "maxMs": 13.940000000002328, + "ratio": 1.013818181819424 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "rapier", - "referenceMs": 4.959999999999127, - "referenceP95Ms": 5.3400000000001455, + "referenceMs": 3.720000000001164, + "referenceP95Ms": 4.440000000002328, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.19999999999708962, - "competitorP95Ms": 0.22000000000116415, + "competitorMs": 2.1599999999743886, + "competitorP95Ms": 2.220000000030268, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 24.800000000356523, - "factor": 24.800000000356523, - "label": "competitor leads clearly (24.80x)", - "structural": true + "ratio": 1.7222222222431818, + "factor": 1.7222222222431818, + "label": "competitor leads (1.72x)", + "structural": false }, - "mechanism": "competitor resolves fewer solved contacts (7875 vs 1125); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "limited", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.940000000000509, - "maxMs": 5.6200000000008, - "ratio": 1.137651821862393 + "minMs": 3.720000000001164, + "maxMs": 3.7399999999979627, + "ratio": 1.0053763440851593 }, "competitor": { - "minMs": 0.19999999999708962, - "maxMs": 0.19999999999708962, - "ratio": 1 + "minMs": 2.080000000016298, + "maxMs": 2.179999999993015, + "ratio": 1.0480769230653526 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } @@ -6379,41 +15353,41 @@ { "archetype": "settling-pile", "category": "Physics", - "count": 3000, - "loadId": "3k", + "count": 5800, + "loadId": "5800", "unit": "bodies", - "primary": true, + "primary": false, "cells": [ { "competitor": "matter-js", - "referenceMs": 3.7400000000016007, - "referenceP95Ms": 4.479999999999563, + "referenceMs": 8.820000000006985, + "referenceP95Ms": 9.920000000012806, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 10.760000000002037, - "competitorP95Ms": 12.540000000000873, + "competitorMs": 24.879999999990105, + "competitorP95Ms": 27.779999999998836, "competitorGpuMs": null, - "competitorOverFrameBudget": false, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.3475836431227595, - "factor": 2.8770053475928963, - "label": "ExoJS leads (2.88x)", + "ratio": 0.35450160771746353, + "factor": 2.8208616780011795, + "label": "ExoJS leads (2.82x)", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.719999999997526, - "maxMs": 3.7400000000016007, - "ratio": 1.0053763440871204 + "minMs": 8.80000000000291, + "maxMs": 8.860000000000582, + "ratio": 1.006818181817915 }, "competitor": { - "minMs": 10.660000000003492, - "maxMs": 10.909999999999854, - "ratio": 1.0234521575981501 + "minMs": 24.789999999993597, + "maxMs": 25.369999999995343, + "ratio": 1.0233965308592938 }, "stable": true, "rungs": [ @@ -6425,34 +15399,34 @@ }, { "competitor": "nape-js", - "referenceMs": 3.7400000000016007, - "referenceP95Ms": 4.479999999999563, + "referenceMs": 8.820000000006985, + "referenceP95Ms": 9.920000000012806, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 11.07999999999447, - "competitorP95Ms": 14.200000000011642, + "competitorMs": 36.070000000006985, + "competitorP95Ms": 45.160000000032596, "competitorGpuMs": null, - "competitorOverFrameBudget": false, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.33754512635410355, - "factor": 2.9625668449170397, - "label": "ExoJS leads (2.96x)", + "ratio": 0.24452453562531956, + "factor": 4.089569160995286, + "label": "ExoJS leads (4.09x)", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.719999999997526, - "maxMs": 3.7400000000016007, - "ratio": 1.0053763440871204 + "minMs": 8.80000000000291, + "maxMs": 8.860000000000582, + "ratio": 1.006818181817915 }, "competitor": { - "minMs": 11.059999999997672, - "maxMs": 11.19999999999709, - "ratio": 1.0126582278480514 + "minMs": 35.70999999999185, + "maxMs": 36.35000000000582, + "ratio": 1.0179221506584744 }, "stable": true, "rungs": [ @@ -6464,73 +15438,73 @@ }, { "competitor": "planck", - "referenceMs": 3.7400000000016007, - "referenceP95Ms": 4.479999999999563, + "referenceMs": 8.820000000006985, + "referenceP95Ms": 9.920000000012806, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 13.220000000001164, - "competitorP95Ms": 19.860000000000582, + "competitorMs": 44.54999999998836, + "competitorP95Ms": 55.73999999999069, "competitorGpuMs": null, - "competitorOverFrameBudget": false, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.28290468986393885, - "factor": 3.5347593582875683, - "label": "ExoJS leads (3.53x)", - "structural": false + "ratio": 0.1979797979800065, + "factor": 5.051020408157945, + "label": "ExoJS leads clearly (5.05x)", + "structural": true }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.719999999997526, - "maxMs": 3.7400000000016007, - "ratio": 1.0053763440871204 + "minMs": 8.80000000000291, + "maxMs": 8.860000000000582, + "ratio": 1.006818181817915 }, "competitor": { - "minMs": 13.200000000004366, - "maxMs": 13.319999999992433, - "ratio": 1.0090909090900022 + "minMs": 44.339999999967404, + "maxMs": 44.69000000003143, + "ratio": 1.0078935498435788 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "rapier", - "referenceMs": 3.7400000000016007, - "referenceP95Ms": 4.479999999999563, + "referenceMs": 8.820000000006985, + "referenceP95Ms": 9.920000000012806, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 2.099999999991269, - "competitorP95Ms": 2.220000000001164, + "competitorMs": 5.199999999982538, + "competitorP95Ms": 5.400000000023283, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.7809523809605479, - "factor": 1.7809523809605479, - "label": "competitor leads (1.78x)", + "ratio": 1.6961538461608854, + "factor": 1.6961538461608854, + "label": "competitor leads (1.70x)", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.719999999997526, - "maxMs": 3.7400000000016007, - "ratio": 1.0053763440871204 + "minMs": 8.80000000000291, + "maxMs": 8.860000000000582, + "ratio": 1.006818181817915 }, "competitor": { - "minMs": 2.0800000000017462, - "maxMs": 2.099999999991269, - "ratio": 1.0096153846103393 + "minMs": 4.7999999999883585, + "maxMs": 5.320000000006985, + "ratio": 1.1083333333374765 }, "stable": true, "rungs": [ @@ -6547,6 +15521,6 @@ }, "signature": { "algorithm": "sha256", - "value": "fbd97ee33f914a4f55e761c15fd321fa6d41a7d1c57d5618fffdd7495d9c049a" + "value": "41e28ace9216711c97a21863226499f55c6e581664bd4eeb1eb9518be6d49569" } }